@jsenv/terminal-recorder 1.5.20 → 1.5.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/jsenv_terminal_recorder_node_modules.js +5 -3
- package/package.json +16 -16
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +1 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +477 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize7as_js_module=.mjs +749 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +2 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css +204 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js +2 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/backend/server/src/services/autoreload_on_server_restart/client/autoreload_on_server_restart.js +133 -0
- package/src/.jsenv/chrome@136.00/@fs/Users/dmail/Documents/dev/jsenv/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1410 -0
- package/src/.jsenv/chrome@136.00/gif_encoder.js +400 -0
- package/src/.jsenv/chrome@136.00/gif_encoder.js.map +11 -0
- package/src/.jsenv/chrome@136.00/lzw_encoder.js +253 -0
- package/src/.jsenv/chrome@136.00/neuquant.js +498 -0
- package/src/.jsenv/chrome@136.00/terminal_recorder.js +389 -0
- package/src/.jsenv/chrome@136.00/terminal_recorder.js.map +11 -0
- package/src/.jsenv/chrome@136.00/xterm.html +52 -0
- package/src/.jsenv/chrome@136.00/xterm.html@L14C5-L18C14.js +5 -0
- package/src/.jsenv/chrome@136.00/xterm.html@L19C5-L24C14.js +7 -0
- package/src/.jsenv/chrome@136.00/xterm.html@L19C5-L24C14.js.map +11 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var s in i)("object"==typeof exports?exports:e)[s]=i[s]}}(globalThis,(()=>(()=>{"use strict";var e={4567:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityManager=void 0;const n=i(9042),o=i(9924),a=i(844),h=i(4725),c=i(2585),l=i(3656);let d=t.AccessibilityManager=class extends a.Disposable{constructor(e,t,i,s){super(),this._terminal=e,this._coreBrowserService=i,this._renderService=s,this._rowColumns=new WeakMap,this._liveRegionLineCount=0,this._charsToConsume=[],this._charsToAnnounce="",this._accessibilityContainer=this._coreBrowserService.mainDocument.createElement("div"),this._accessibilityContainer.classList.add("xterm-accessibility"),this._rowContainer=this._coreBrowserService.mainDocument.createElement("div"),this._rowContainer.setAttribute("role","list"),this._rowContainer.classList.add("xterm-accessibility-tree"),this._rowElements=[];for(let e=0;e<this._terminal.rows;e++)this._rowElements[e]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[e]);if(this._topBoundaryFocusListener=e=>this._handleBoundaryFocus(e,0),this._bottomBoundaryFocusListener=e=>this._handleBoundaryFocus(e,1),this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions(),this._accessibilityContainer.appendChild(this._rowContainer),this._liveRegion=this._coreBrowserService.mainDocument.createElement("div"),this._liveRegion.classList.add("live-region"),this._liveRegion.setAttribute("aria-live","assertive"),this._accessibilityContainer.appendChild(this._liveRegion),this._liveRegionDebouncer=this.register(new o.TimeBasedDebouncer(this._renderRows.bind(this))),!this._terminal.element)throw new Error("Cannot enable accessibility before Terminal.open");this._terminal.element.insertAdjacentElement("afterbegin",this._accessibilityContainer),this.register(this._terminal.onResize((e=>this._handleResize(e.rows)))),this.register(this._terminal.onRender((e=>this._refreshRows(e.start,e.end)))),this.register(this._terminal.onScroll((()=>this._refreshRows()))),this.register(this._terminal.onA11yChar((e=>this._handleChar(e)))),this.register(this._terminal.onLineFeed((()=>this._handleChar("\n")))),this.register(this._terminal.onA11yTab((e=>this._handleTab(e)))),this.register(this._terminal.onKey((e=>this._handleKey(e.key)))),this.register(this._terminal.onBlur((()=>this._clearLiveRegion()))),this.register(this._renderService.onDimensionsChange((()=>this._refreshRowsDimensions()))),this.register((0,l.addDisposableDomListener)(document,"selectionchange",(()=>this._handleSelectionChange()))),this.register(this._coreBrowserService.onDprChange((()=>this._refreshRowsDimensions()))),this._refreshRows(),this.register((0,a.toDisposable)((()=>{this._accessibilityContainer.remove(),this._rowElements.length=0})))}_handleTab(e){for(let t=0;t<e;t++)this._handleChar(" ")}_handleChar(e){this._liveRegionLineCount<21&&(this._charsToConsume.length>0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,"\n"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=n.tooMuchOutput)))}_clearLiveRegion(){this._liveRegion.textContent="",this._liveRegionLineCount=0}_handleKey(e){this._clearLiveRegion(),/\p{Control}/u.test(e)||this._charsToConsume.push(e)}_refreshRows(e,t){this._liveRegionDebouncer.refresh(e,t,this._terminal.rows)}_renderRows(e,t){const i=this._terminal.buffer,s=i.lines.length.toString();for(let r=e;r<=t;r++){const e=i.lines.get(i.ydisp+r),t=[],n=e?.translateToString(!0,void 0,void 0,t)||"",o=(i.ydisp+r+1).toString(),a=this._rowElements[r];a&&(0===n.length?(a.innerText=" ",this._rowColumns.set(a,[0,1])):(a.textContent=n,this._rowColumns.set(a,t)),a.setAttribute("aria-posinset",o),a.setAttribute("aria-setsize",s))}this._announceCharacters()}_announceCharacters(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce="")}_handleBoundaryFocus(e,t){const i=e.target,s=this._rowElements[0===t?1:this._rowElements.length-2];if(i.getAttribute("aria-posinset")===(0===t?"1":`${this._terminal.buffer.lines.length}`))return;if(e.relatedTarget!==s)return;let r,n;if(0===t?(r=i,n=this._rowElements.pop(),this._rowContainer.removeChild(n)):(r=this._rowElements.shift(),n=i,this._rowContainer.removeChild(r)),r.removeEventListener("focus",this._topBoundaryFocusListener),n.removeEventListener("focus",this._bottomBoundaryFocusListener),0===t){const e=this._createAccessibilityTreeNode();this._rowElements.unshift(e),this._rowContainer.insertAdjacentElement("afterbegin",e)}else{const e=this._createAccessibilityTreeNode();this._rowElements.push(e),this._rowContainer.appendChild(e)}this._rowElements[0].addEventListener("focus",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}_handleSelectionChange(){if(0===this._rowElements.length)return;const e=document.getSelection();if(!e)return;if(e.isCollapsed)return void(this._rowContainer.contains(e.anchorNode)&&this._terminal.clearSelection());if(!e.anchorNode||!e.focusNode)return void console.error("anchorNode and/or focusNode are null");let t={node:e.anchorNode,offset:e.anchorOffset},i={node:e.focusNode,offset:e.focusOffset};if((t.node.compareDocumentPosition(i.node)&Node.DOCUMENT_POSITION_PRECEDING||t.node===i.node&&t.offset>i.offset)&&([t,i]=[i,t]),t.node.compareDocumentPosition(this._rowElements[0])&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_FOLLOWING)&&(t={node:this._rowElements[0].childNodes[0],offset:0}),!this._rowContainer.contains(t.node))return;const s=this._rowElements.slice(-1)[0];if(i.node.compareDocumentPosition(s)&(Node.DOCUMENT_POSITION_CONTAINED_BY|Node.DOCUMENT_POSITION_PRECEDING)&&(i={node:s,offset:s.textContent?.length??0}),!this._rowContainer.contains(i.node))return;const r=({node:e,offset:t})=>{const i=e instanceof Text?e.parentNode:e;let s=parseInt(i?.getAttribute("aria-posinset"),10)-1;if(isNaN(s))return console.warn("row is invalid. Race condition?"),null;const r=this._rowColumns.get(i);if(!r)return console.warn("columns is null. Race condition?"),null;let n=t<r.length?r[t]:r.slice(-1)[0]+1;return n>=this._terminal.cols&&(++s,n=0),{row:s,column:n}},n=r(t),o=r(i);if(n&&o){if(n.row>o.row||n.row===o.row&&n.column>=o.column)throw new Error("invalid range");this._terminal.select(n.column,n.row,(o.row-n.row)*this._terminal.cols-n.column+o.column)}}_handleResize(e){this._rowElements[this._rowElements.length-1].removeEventListener("focus",this._bottomBoundaryFocusListener);for(let e=this._rowContainer.children.length;e<this._terminal.rows;e++)this._rowElements[e]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[e]);for(;this._rowElements.length>e;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener("focus",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()}_createAccessibilityTreeNode(){const e=this._coreBrowserService.mainDocument.createElement("div");return e.setAttribute("role","listitem"),e.tabIndex=-1,this._refreshRowDimensions(e),e}_refreshRowsDimensions(){if(this._renderService.dimensions.css.cell.height){this._accessibilityContainer.style.width=`${this._renderService.dimensions.css.canvas.width}px`,this._rowElements.length!==this._terminal.rows&&this._handleResize(this._terminal.rows);for(let e=0;e<this._terminal.rows;e++)this._refreshRowDimensions(this._rowElements[e])}}_refreshRowDimensions(e){e.style.height=`${this._renderService.dimensions.css.cell.height}px`}};t.AccessibilityManager=d=s([r(1,c.IInstantiationService),r(2,h.ICoreBrowserService),r(3,h.IRenderService)],d)},3614:(e,t)=>{function i(e){return e.replace(/\r?\n/g,"\r")}function s(e,t){return t?"[200~"+e+"[201~":e}function r(e,t,r,n){e=s(e=i(e),r.decPrivateModes.bracketedPasteMode&&!0!==n.rawOptions.ignoreBracketedPasteMode),r.triggerDataEvent(e,!0),t.value=""}function n(e,t,i){const s=i.getBoundingClientRect(),r=e.clientX-s.left-10,n=e.clientY-s.top-10;t.style.width="20px",t.style.height="20px",t.style.left=`${r}px`,t.style.top=`${n}px`,t.style.zIndex="1000",t.focus()}Object.defineProperty(t,"__esModule",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=i,t.bracketTextForPaste=s,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData("text/plain",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,i,s){e.stopPropagation(),e.clipboardData&&r(e.clipboardData.getData("text/plain"),t,i,s)},t.paste=r,t.moveTextAreaUnderMouseCursor=n,t.rightClickHandler=function(e,t,i,s,r){n(e,t,i),r&&s.rightClickSelect(e),t.value=s.selectionText,t.select()}},7239:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorContrastCache=void 0;const s=i(1505);t.ColorContrastCache=class{constructor(){this._color=new s.TwoKeyMap,this._css=new s.TwoKeyMap}setCss(e,t,i){this._css.set(e,t,i)}getCss(e,t){return this._css.get(e,t)}setColor(e,t,i){this._color.set(e,t,i)}getColor(e,t){return this._color.get(e,t)}clear(){this._color.clear(),this._css.clear()}}},3656:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,i,s){e.addEventListener(t,i,s);let r=!1;return{dispose:()=>{r||(r=!0,e.removeEventListener(t,i,s))}}}},3551:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Linkifier=void 0;const n=i(3656),o=i(8460),a=i(844),h=i(2585),c=i(4725);let l=t.Linkifier=class extends a.Disposable{get currentLink(){return this._currentLink}constructor(e,t,i,s,r){super(),this._element=e,this._mouseService=t,this._renderService=i,this._bufferService=s,this._linkProviderService=r,this._linkCacheDisposables=[],this._isMouseOut=!0,this._wasResized=!1,this._activeLine=-1,this._onShowLinkUnderline=this.register(new o.EventEmitter),this.onShowLinkUnderline=this._onShowLinkUnderline.event,this._onHideLinkUnderline=this.register(new o.EventEmitter),this.onHideLinkUnderline=this._onHideLinkUnderline.event,this.register((0,a.getDisposeArrayDisposable)(this._linkCacheDisposables)),this.register((0,a.toDisposable)((()=>{this._lastMouseEvent=void 0,this._activeProviderReplies?.clear()}))),this.register(this._bufferService.onResize((()=>{this._clearCurrentLink(),this._wasResized=!0}))),this.register((0,n.addDisposableDomListener)(this._element,"mouseleave",(()=>{this._isMouseOut=!0,this._clearCurrentLink()}))),this.register((0,n.addDisposableDomListener)(this._element,"mousemove",this._handleMouseMove.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mousedown",this._handleMouseDown.bind(this))),this.register((0,n.addDisposableDomListener)(this._element,"mouseup",this._handleMouseUp.bind(this)))}_handleMouseMove(e){this._lastMouseEvent=e;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(!t)return;this._isMouseOut=!1;const i=e.composedPath();for(let e=0;e<i.length;e++){const t=i[e];if(t.classList.contains("xterm"))break;if(t.classList.contains("xterm-hover"))return}this._lastBufferCell&&t.x===this._lastBufferCell.x&&t.y===this._lastBufferCell.y||(this._handleHover(t),this._lastBufferCell=t)}_handleHover(e){if(this._activeLine!==e.y||this._wasResized)return this._clearCurrentLink(),this._askForLink(e,!1),void(this._wasResized=!1);this._currentLink&&this._linkAtPosition(this._currentLink.link,e)||(this._clearCurrentLink(),this._askForLink(e,!0))}_askForLink(e,t){this._activeProviderReplies&&t||(this._activeProviderReplies?.forEach((e=>{e?.forEach((e=>{e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);let i=!1;for(const[s,r]of this._linkProviderService.linkProviders.entries())if(t){const t=this._activeProviderReplies?.get(s);t&&(i=this._checkLinkProviderResult(s,e,i))}else r.provideLinks(e.y,(t=>{if(this._isMouseOut)return;const r=t?.map((e=>({link:e})));this._activeProviderReplies?.set(s,r),i=this._checkLinkProviderResult(s,e,i),this._activeProviderReplies?.size===this._linkProviderService.linkProviders.length&&this._removeIntersectingLinks(e.y,this._activeProviderReplies)}))}_removeIntersectingLinks(e,t){const i=new Set;for(let s=0;s<t.size;s++){const r=t.get(s);if(r)for(let t=0;t<r.length;t++){const s=r[t],n=s.link.range.start.y<e?0:s.link.range.start.x,o=s.link.range.end.y>e?this._bufferService.cols:s.link.range.end.x;for(let e=n;e<=o;e++){if(i.has(e)){r.splice(t--,1);break}i.add(e)}}}}_checkLinkProviderResult(e,t,i){if(!this._activeProviderReplies)return i;const s=this._activeProviderReplies.get(e);let r=!1;for(let t=0;t<e;t++)this._activeProviderReplies.has(t)&&!this._activeProviderReplies.get(t)||(r=!0);if(!r&&s){const e=s.find((e=>this._linkAtPosition(e.link,t)));e&&(i=!0,this._handleNewLink(e))}if(this._activeProviderReplies.size===this._linkProviderService.linkProviders.length&&!i)for(let e=0;e<this._activeProviderReplies.size;e++){const s=this._activeProviderReplies.get(e)?.find((e=>this._linkAtPosition(e.link,t)));if(s){i=!0,this._handleNewLink(s);break}}return i}_handleMouseDown(){this._mouseDownLink=this._currentLink}_handleMouseUp(e){if(!this._currentLink)return;const t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._mouseDownLink===this._currentLink&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}_clearCurrentLink(e,t){this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,a.disposeArray)(this._linkCacheDisposables))}_handleNewLink(e){if(!this._lastMouseEvent)return;const t=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);t&&this._linkAtPosition(e.link,t)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:()=>this._currentLink?.state?.decorations.pointerCursor,set:e=>{this._currentLink?.state&&this._currentLink.state.decorations.pointerCursor!==e&&(this._currentLink.state.decorations.pointerCursor=e,this._currentLink.state.isHovered&&this._element.classList.toggle("xterm-cursor-pointer",e))}},underline:{get:()=>this._currentLink?.state?.decorations.underline,set:t=>{this._currentLink?.state&&this._currentLink?.state?.decorations.underline!==t&&(this._currentLink.state.decorations.underline=t,this._currentLink.state.isHovered&&this._fireUnderlineEvent(e.link,t))}}}),this._linkCacheDisposables.push(this._renderService.onRenderedViewportChange((e=>{if(!this._currentLink)return;const t=0===e.start?0:e.start+1+this._bufferService.buffer.ydisp,i=this._bufferService.buffer.ydisp+1+e.end;if(this._currentLink.link.range.start.y>=t&&this._currentLink.link.range.end.y<=i&&(this._clearCurrentLink(t,i),this._lastMouseEvent)){const e=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);e&&this._askForLink(e,!1)}}))))}_linkHover(e,t,i){this._currentLink?.state&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add("xterm-cursor-pointer")),t.hover&&t.hover(i,t.text)}_fireUnderlineEvent(e,t){const i=e.range,s=this._bufferService.buffer.ydisp,r=this._createLinkUnderlineEvent(i.start.x-1,i.start.y-s-1,i.end.x,i.end.y-s-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(r)}_linkLeave(e,t,i){this._currentLink?.state&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove("xterm-cursor-pointer")),t.leave&&t.leave(i,t.text)}_linkAtPosition(e,t){const i=e.range.start.y*this._bufferService.cols+e.range.start.x,s=e.range.end.y*this._bufferService.cols+e.range.end.x,r=t.y*this._bufferService.cols+t.x;return i<=r&&r<=s}_positionFromMouseEvent(e,t,i){const s=i.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(s)return{x:s[0],y:s[1]+this._bufferService.buffer.ydisp}}_createLinkUnderlineEvent(e,t,i,s,r){return{x1:e,y1:t,x2:i,y2:s,cols:this._bufferService.cols,fg:r}}};t.Linkifier=l=s([r(1,c.IMouseService),r(2,c.IRenderService),r(3,h.IBufferService),r(4,c.ILinkProviderService)],l)},9042:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel="Terminal input",t.tooMuchOutput="Too much output to announce, navigate to rows manually to read"},3730:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkProvider=void 0;const n=i(511),o=i(2585);let a=t.OscLinkProvider=class{constructor(e,t,i){this._bufferService=e,this._optionsService=t,this._oscLinkService=i}provideLinks(e,t){const i=this._bufferService.buffer.lines.get(e-1);if(!i)return void t(void 0);const s=[],r=this._optionsService.rawOptions.linkHandler,o=new n.CellData,a=i.getTrimmedLength();let c=-1,l=-1,d=!1;for(let t=0;t<a;t++)if(-1!==l||i.hasContent(t)){if(i.loadCell(t,o),o.hasExtendedAttrs()&&o.extended.urlId){if(-1===l){l=t,c=o.extended.urlId;continue}d=o.extended.urlId!==c}else-1!==l&&(d=!0);if(d||-1!==l&&t===a-1){const i=this._oscLinkService.getLinkData(c)?.uri;if(i){const n={start:{x:l+1,y:e},end:{x:t+(d||t!==a-1?0:1),y:e}};let o=!1;if(!r?.allowNonHttpProtocols)try{const e=new URL(i);["http:","https:"].includes(e.protocol)||(o=!0)}catch(e){o=!0}o||s.push({text:i,range:n,activate:(e,t)=>r?r.activate(e,t,n):h(0,t),hover:(e,t)=>r?.hover?.(e,t,n),leave:(e,t)=>r?.leave?.(e,t,n)})}d=!1,o.hasExtendedAttrs()&&o.extended.urlId?(l=t,c=o.extended.urlId):(l=-1,c=-1)}}t(s)}};function h(e,t){if(confirm(`Do you want to navigate to ${t}?\n\nWARNING: This link could potentially be dangerous`)){const e=window.open();if(e){try{e.opener=null}catch{}e.location.href=t}else console.warn("Opening link blocked as opener could not be cleared")}}t.OscLinkProvider=a=s([r(0,o.IBufferService),r(1,o.IOptionsService),r(2,o.IOscLinkService)],a)},6193:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.RenderDebouncer=void 0,t.RenderDebouncer=class{constructor(e,t){this._renderCallback=e,this._coreBrowserService=t,this._refreshCallbacks=[]}dispose(){this._animationFrame&&(this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)}addRefreshCallback(e){return this._refreshCallbacks.push(e),this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh()))),this._animationFrame}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._animationFrame=void 0,void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return void this._runRefreshCallbacks();const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t),this._runRefreshCallbacks()}_runRefreshCallbacks(){for(const e of this._refreshCallbacks)e(0);this._refreshCallbacks=[]}}},3236:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Terminal=void 0;const s=i(3614),r=i(3656),n=i(3551),o=i(9042),a=i(3730),h=i(1680),c=i(3107),l=i(5744),d=i(2950),_=i(1296),u=i(428),f=i(4269),v=i(5114),p=i(8934),g=i(3230),m=i(9312),S=i(4725),C=i(6731),b=i(8055),w=i(8969),y=i(8460),E=i(844),k=i(6114),L=i(8437),D=i(2584),R=i(7399),x=i(5941),A=i(9074),B=i(2585),T=i(5435),M=i(4567),O=i(779);class P extends w.CoreTerminal{get onFocus(){return this._onFocus.event}get onBlur(){return this._onBlur.event}get onA11yChar(){return this._onA11yCharEmitter.event}get onA11yTab(){return this._onA11yTabEmitter.event}get onWillOpen(){return this._onWillOpen.event}constructor(e={}){super(e),this.browser=k,this._keyDownHandled=!1,this._keyDownSeen=!1,this._keyPressHandled=!1,this._unprocessedDeadKey=!1,this._accessibilityManager=this.register(new E.MutableDisposable),this._onCursorMove=this.register(new y.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onKey=this.register(new y.EventEmitter),this.onKey=this._onKey.event,this._onRender=this.register(new y.EventEmitter),this.onRender=this._onRender.event,this._onSelectionChange=this.register(new y.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onTitleChange=this.register(new y.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onBell=this.register(new y.EventEmitter),this.onBell=this._onBell.event,this._onFocus=this.register(new y.EventEmitter),this._onBlur=this.register(new y.EventEmitter),this._onA11yCharEmitter=this.register(new y.EventEmitter),this._onA11yTabEmitter=this.register(new y.EventEmitter),this._onWillOpen=this.register(new y.EventEmitter),this._setup(),this._decorationService=this._instantiationService.createInstance(A.DecorationService),this._instantiationService.setService(B.IDecorationService,this._decorationService),this._linkProviderService=this._instantiationService.createInstance(O.LinkProviderService),this._instantiationService.setService(S.ILinkProviderService,this._linkProviderService),this._linkProviderService.registerLinkProvider(this._instantiationService.createInstance(a.OscLinkProvider)),this.register(this._inputHandler.onRequestBell((()=>this._onBell.fire()))),this.register(this._inputHandler.onRequestRefreshRows(((e,t)=>this.refresh(e,t)))),this.register(this._inputHandler.onRequestSendFocus((()=>this._reportFocus()))),this.register(this._inputHandler.onRequestReset((()=>this.reset()))),this.register(this._inputHandler.onRequestWindowsOptionsReport((e=>this._reportWindowsOptions(e)))),this.register(this._inputHandler.onColor((e=>this._handleColorEvent(e)))),this.register((0,y.forwardEvent)(this._inputHandler.onCursorMove,this._onCursorMove)),this.register((0,y.forwardEvent)(this._inputHandler.onTitleChange,this._onTitleChange)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yChar,this._onA11yCharEmitter)),this.register((0,y.forwardEvent)(this._inputHandler.onA11yTab,this._onA11yTabEmitter)),this.register(this._bufferService.onResize((e=>this._afterResize(e.cols,e.rows)))),this.register((0,E.toDisposable)((()=>{this._customKeyEventHandler=void 0,this.element?.parentNode?.removeChild(this.element)})))}_handleColorEvent(e){if(this._themeService)for(const t of e){let e,i="";switch(t.index){case 256:e="foreground",i="10";break;case 257:e="background",i="11";break;case 258:e="cursor",i="12";break;default:e="ansi",i="4;"+t.index}switch(t.type){case 0:const s=b.color.toColorRGB("ansi"===e?this._themeService.colors.ansi[t.index]:this._themeService.colors[e]);this.coreService.triggerDataEvent(`${D.C0.ESC}]${i};${(0,x.toRgbString)(s)}${D.C1_ESCAPED.ST}`);break;case 1:if("ansi"===e)this._themeService.modifyColors((e=>e.ansi[t.index]=b.channels.toColor(...t.color)));else{const i=e;this._themeService.modifyColors((e=>e[i]=b.channels.toColor(...t.color)))}break;case 2:this._themeService.restoreColor(t.index)}}}_setup(){super._setup(),this._customKeyEventHandler=void 0}get buffer(){return this.buffers.active}focus(){this.textarea&&this.textarea.focus({preventScroll:!0})}_handleScreenReaderModeOptionChange(e){e?!this._accessibilityManager.value&&this._renderService&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)):this._accessibilityManager.clear()}_handleTextAreaFocus(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[I"),this.element.classList.add("focus"),this._showCursor(),this._onFocus.fire()}blur(){return this.textarea?.blur()}_handleTextAreaBlur(){this.textarea.value="",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(D.C0.ESC+"[O"),this.element.classList.remove("focus"),this._onBlur.fire()}_syncTextArea(){if(!this.textarea||!this.buffer.isCursorInViewport||this._compositionHelper.isComposing||!this._renderService)return;const e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(!t)return;const i=Math.min(this.buffer.x,this.cols-1),s=this._renderService.dimensions.css.cell.height,r=t.getWidth(i),n=this._renderService.dimensions.css.cell.width*r,o=this.buffer.y*this._renderService.dimensions.css.cell.height,a=i*this._renderService.dimensions.css.cell.width;this.textarea.style.left=a+"px",this.textarea.style.top=o+"px",this.textarea.style.width=n+"px",this.textarea.style.height=s+"px",this.textarea.style.lineHeight=s+"px",this.textarea.style.zIndex="-5"}_initGlobal(){this._bindKeys(),this.register((0,r.addDisposableDomListener)(this.element,"copy",(e=>{this.hasSelection()&&(0,s.copyHandler)(e,this._selectionService)})));const e=e=>(0,s.handlePasteEvent)(e,this.textarea,this.coreService,this.optionsService);this.register((0,r.addDisposableDomListener)(this.textarea,"paste",e)),this.register((0,r.addDisposableDomListener)(this.element,"paste",e)),k.isFirefox?this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>{2===e.button&&(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))):this.register((0,r.addDisposableDomListener)(this.element,"contextmenu",(e=>{(0,s.rightClickHandler)(e,this.textarea,this.screenElement,this._selectionService,this.options.rightClickSelectsWord)}))),k.isLinux&&this.register((0,r.addDisposableDomListener)(this.element,"auxclick",(e=>{1===e.button&&(0,s.moveTextAreaUnderMouseCursor)(e,this.textarea,this.screenElement)})))}_bindKeys(){this.register((0,r.addDisposableDomListener)(this.textarea,"keyup",(e=>this._keyUp(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keydown",(e=>this._keyDown(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"keypress",(e=>this._keyPress(e)),!0)),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionstart",(()=>this._compositionHelper.compositionstart()))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionupdate",(e=>this._compositionHelper.compositionupdate(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"compositionend",(()=>this._compositionHelper.compositionend()))),this.register((0,r.addDisposableDomListener)(this.textarea,"input",(e=>this._inputEvent(e)),!0)),this.register(this.onRender((()=>this._compositionHelper.updateCompositionElements())))}open(e){if(!e)throw new Error("Terminal requires a parent element.");if(e.isConnected||this._logService.debug("Terminal.open was called on an element that was not attached to the DOM"),this.element?.ownerDocument.defaultView&&this._coreBrowserService)return void(this.element.ownerDocument.defaultView!==this._coreBrowserService.window&&(this._coreBrowserService.window=this.element.ownerDocument.defaultView));this._document=e.ownerDocument,this.options.documentOverride&&this.options.documentOverride instanceof Document&&(this._document=this.optionsService.rawOptions.documentOverride),this.element=this._document.createElement("div"),this.element.dir="ltr",this.element.classList.add("terminal"),this.element.classList.add("xterm"),e.appendChild(this.element);const t=this._document.createDocumentFragment();this._viewportElement=this._document.createElement("div"),this._viewportElement.classList.add("xterm-viewport"),t.appendChild(this._viewportElement),this._viewportScrollArea=this._document.createElement("div"),this._viewportScrollArea.classList.add("xterm-scroll-area"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=this._document.createElement("div"),this.screenElement.classList.add("xterm-screen"),this.register((0,r.addDisposableDomListener)(this.screenElement,"mousemove",(e=>this.updateCursorStyle(e)))),this._helperContainer=this._document.createElement("div"),this._helperContainer.classList.add("xterm-helpers"),this.screenElement.appendChild(this._helperContainer),t.appendChild(this.screenElement),this.textarea=this._document.createElement("textarea"),this.textarea.classList.add("xterm-helper-textarea"),this.textarea.setAttribute("aria-label",o.promptLabel),k.isChromeOS||this.textarea.setAttribute("aria-multiline","false"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.tabIndex=0,this._coreBrowserService=this.register(this._instantiationService.createInstance(v.CoreBrowserService,this.textarea,e.ownerDocument.defaultView??window,this._document??"undefined"!=typeof window?window.document:null)),this._instantiationService.setService(S.ICoreBrowserService,this._coreBrowserService),this.register((0,r.addDisposableDomListener)(this.textarea,"focus",(e=>this._handleTextAreaFocus(e)))),this.register((0,r.addDisposableDomListener)(this.textarea,"blur",(()=>this._handleTextAreaBlur()))),this._helperContainer.appendChild(this.textarea),this._charSizeService=this._instantiationService.createInstance(u.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(S.ICharSizeService,this._charSizeService),this._themeService=this._instantiationService.createInstance(C.ThemeService),this._instantiationService.setService(S.IThemeService,this._themeService),this._characterJoinerService=this._instantiationService.createInstance(f.CharacterJoinerService),this._instantiationService.setService(S.ICharacterJoinerService,this._characterJoinerService),this._renderService=this.register(this._instantiationService.createInstance(g.RenderService,this.rows,this.screenElement)),this._instantiationService.setService(S.IRenderService,this._renderService),this.register(this._renderService.onRenderedViewportChange((e=>this._onRender.fire(e)))),this.onResize((e=>this._renderService.resize(e.cols,e.rows))),this._compositionView=this._document.createElement("div"),this._compositionView.classList.add("composition-view"),this._compositionHelper=this._instantiationService.createInstance(d.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this._mouseService=this._instantiationService.createInstance(p.MouseService),this._instantiationService.setService(S.IMouseService,this._mouseService),this.linkifier=this.register(this._instantiationService.createInstance(n.Linkifier,this.screenElement)),this.element.appendChild(t);try{this._onWillOpen.fire(this.element)}catch{}this._renderService.hasRenderer()||this._renderService.setRenderer(this._createRenderer()),this.viewport=this._instantiationService.createInstance(h.Viewport,this._viewportElement,this._viewportScrollArea),this.viewport.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent,1))),this.register(this._inputHandler.onRequestSyncScrollBar((()=>this.viewport.syncScrollArea()))),this.register(this.viewport),this.register(this.onCursorMove((()=>{this._renderService.handleCursorMove(),this._syncTextArea()}))),this.register(this.onResize((()=>this._renderService.handleResize(this.cols,this.rows)))),this.register(this.onBlur((()=>this._renderService.handleBlur()))),this.register(this.onFocus((()=>this._renderService.handleFocus()))),this.register(this._renderService.onDimensionsChange((()=>this.viewport.syncScrollArea()))),this._selectionService=this.register(this._instantiationService.createInstance(m.SelectionService,this.element,this.screenElement,this.linkifier)),this._instantiationService.setService(S.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((e=>this.scrollLines(e.amount,e.suppressScrollEvent)))),this.register(this._selectionService.onSelectionChange((()=>this._onSelectionChange.fire()))),this.register(this._selectionService.onRequestRedraw((e=>this._renderService.handleSelectionChanged(e.start,e.end,e.columnSelectMode)))),this.register(this._selectionService.onLinuxMouseSelection((e=>{this.textarea.value=e,this.textarea.focus(),this.textarea.select()}))),this.register(this._onScroll.event((e=>{this.viewport.syncScrollArea(),this._selectionService.refresh()}))),this.register((0,r.addDisposableDomListener)(this._viewportElement,"scroll",(()=>this._selectionService.refresh()))),this.register(this._instantiationService.createInstance(c.BufferDecorationRenderer,this.screenElement)),this.register((0,r.addDisposableDomListener)(this.element,"mousedown",(e=>this._selectionService.handleMouseDown(e)))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add("enable-mouse-events")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager.value=this._instantiationService.createInstance(M.AccessibilityManager,this)),this.register(this.optionsService.onSpecificOptionChange("screenReaderMode",(e=>this._handleScreenReaderModeOptionChange(e)))),this.options.overviewRulerWidth&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement))),this.optionsService.onSpecificOptionChange("overviewRulerWidth",(e=>{!this._overviewRulerRenderer&&e&&this._viewportElement&&this.screenElement&&(this._overviewRulerRenderer=this.register(this._instantiationService.createInstance(l.OverviewRulerRenderer,this._viewportElement,this.screenElement)))})),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()}_createRenderer(){return this._instantiationService.createInstance(_.DomRenderer,this,this._document,this.element,this.screenElement,this._viewportElement,this._helperContainer,this.linkifier)}bindMouse(){const e=this,t=this.element;function i(t){const i=e._mouseService.getMouseReportCoords(t,e.screenElement);if(!i)return!1;let s,r;switch(t.overrideType||t.type){case"mousemove":r=32,void 0===t.buttons?(s=3,void 0!==t.button&&(s=t.button<3?t.button:3)):s=1&t.buttons?0:4&t.buttons?1:2&t.buttons?2:3;break;case"mouseup":r=0,s=t.button<3?t.button:3;break;case"mousedown":r=1,s=t.button<3?t.button:3;break;case"wheel":if(e._customWheelEventHandler&&!1===e._customWheelEventHandler(t))return!1;if(0===e.viewport.getLinesScrolled(t))return!1;r=t.deltaY<0?0:1,s=4;break;default:return!1}return!(void 0===r||void 0===s||s>4)&&e.coreMouseService.triggerMouseEvent({col:i.col,row:i.row,x:i.x,y:i.y,button:s,action:r,ctrl:t.ctrlKey,alt:t.altKey,shift:t.shiftKey})}const s={mouseup:null,wheel:null,mousedrag:null,mousemove:null},n={mouseup:e=>(i(e),e.buttons||(this._document.removeEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.removeEventListener("mousemove",s.mousedrag)),this.cancel(e)),wheel:e=>(i(e),this.cancel(e,!0)),mousedrag:e=>{e.buttons&&i(e)},mousemove:e=>{e.buttons||i(e)}};this.register(this.coreMouseService.onProtocolChange((e=>{e?("debug"===this.optionsService.rawOptions.logLevel&&this._logService.debug("Binding to mouse events:",this.coreMouseService.explainEvents(e)),this.element.classList.add("enable-mouse-events"),this._selectionService.disable()):(this._logService.debug("Unbinding from mouse events."),this.element.classList.remove("enable-mouse-events"),this._selectionService.enable()),8&e?s.mousemove||(t.addEventListener("mousemove",n.mousemove),s.mousemove=n.mousemove):(t.removeEventListener("mousemove",s.mousemove),s.mousemove=null),16&e?s.wheel||(t.addEventListener("wheel",n.wheel,{passive:!1}),s.wheel=n.wheel):(t.removeEventListener("wheel",s.wheel),s.wheel=null),2&e?s.mouseup||(s.mouseup=n.mouseup):(this._document.removeEventListener("mouseup",s.mouseup),s.mouseup=null),4&e?s.mousedrag||(s.mousedrag=n.mousedrag):(this._document.removeEventListener("mousemove",s.mousedrag),s.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,r.addDisposableDomListener)(t,"mousedown",(e=>{if(e.preventDefault(),this.focus(),this.coreMouseService.areMouseEventsActive&&!this._selectionService.shouldForceSelection(e))return i(e),s.mouseup&&this._document.addEventListener("mouseup",s.mouseup),s.mousedrag&&this._document.addEventListener("mousemove",s.mousedrag),this.cancel(e)}))),this.register((0,r.addDisposableDomListener)(t,"wheel",(e=>{if(!s.wheel){if(this._customWheelEventHandler&&!1===this._customWheelEventHandler(e))return!1;if(!this.buffer.hasScrollback){const t=this.viewport.getLinesScrolled(e);if(0===t)return;const i=D.C0.ESC+(this.coreService.decPrivateModes.applicationCursorKeys?"O":"[")+(e.deltaY<0?"A":"B");let s="";for(let e=0;e<Math.abs(t);e++)s+=i;return this.coreService.triggerDataEvent(s,!0),this.cancel(e,!0)}return this.viewport.handleWheel(e)?this.cancel(e):void 0}}),{passive:!1})),this.register((0,r.addDisposableDomListener)(t,"touchstart",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchStart(e),this.cancel(e)}),{passive:!0})),this.register((0,r.addDisposableDomListener)(t,"touchmove",(e=>{if(!this.coreMouseService.areMouseEventsActive)return this.viewport.handleTouchMove(e)?void 0:this.cancel(e)}),{passive:!1}))}refresh(e,t){this._renderService?.refreshRows(e,t)}updateCursorStyle(e){this._selectionService?.shouldColumnSelect(e)?this.element.classList.add("column-select"):this.element.classList.remove("column-select")}_showCursor(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))}scrollLines(e,t,i=0){1===i?(super.scrollLines(e,t,i),this.refresh(0,this.rows-1)):this.viewport?.scrollLines(e)}paste(e){(0,s.paste)(e,this.textarea,this.coreService,this.optionsService)}attachCustomKeyEventHandler(e){this._customKeyEventHandler=e}attachCustomWheelEventHandler(e){this._customWheelEventHandler=e}registerLinkProvider(e){return this._linkProviderService.registerLinkProvider(e)}registerCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");const t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t}deregisterCharacterJoiner(e){if(!this._characterJoinerService)throw new Error("Terminal must be opened first");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)}get markers(){return this.buffer.markers}registerMarker(e){return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)}registerDecoration(e){return this._decorationService.registerDecoration(e)}hasSelection(){return!!this._selectionService&&this._selectionService.hasSelection}select(e,t,i){this._selectionService.setSelection(e,t,i)}getSelection(){return this._selectionService?this._selectionService.selectionText:""}getSelectionPosition(){if(this._selectionService&&this._selectionService.hasSelection)return{start:{x:this._selectionService.selectionStart[0],y:this._selectionService.selectionStart[1]},end:{x:this._selectionService.selectionEnd[0],y:this._selectionService.selectionEnd[1]}}}clearSelection(){this._selectionService?.clearSelection()}selectAll(){this._selectionService?.selectAll()}selectLines(e,t){this._selectionService?.selectLines(e,t)}_keyDown(e){if(this._keyDownHandled=!1,this._keyDownSeen=!0,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;const t=this.browser.isMac&&this.options.macOptionIsMeta&&e.altKey;if(!t&&!this._compositionHelper.keydown(e))return this.options.scrollOnUserInput&&this.buffer.ybase!==this.buffer.ydisp&&this.scrollToBottom(),!1;t||"Dead"!==e.key&&"AltGraph"!==e.key||(this._unprocessedDeadKey=!0);const i=(0,R.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===i.type||2===i.type){const t=this.rows-1;return this.scrollLines(2===i.type?-t:t),this.cancel(e,!0)}return 1===i.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(i.cancel&&this.cancel(e,!0),!i.key||!!(e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&1===e.key.length&&e.key.charCodeAt(0)>=65&&e.key.charCodeAt(0)<=90)||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(i.key!==D.C0.ETX&&i.key!==D.C0.CR||(this.textarea.value=""),this._onKey.fire({key:i.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(i.key,!0),!this.optionsService.rawOptions.screenReaderMode||e.altKey||e.ctrlKey?this.cancel(e,!0):void(this._keyDownHandled=!0))))}_isThirdLevelShift(e,t){const i=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState("AltGraph");return"keypress"===t.type?i:i&&(!t.keyCode||t.keyCode>47)}_keyUp(e){this._keyDownSeen=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)}_keyPress(e){let t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))}_inputEvent(e){if(e.data&&"insertText"===e.inputType&&(!e.composed||!this._keyDownSeen)&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;const t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1}resize(e,t){e!==this.cols||t!==this.rows?super.resize(e,t):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()}_afterResize(e,t){this._charSizeService?.measure(),this.viewport?.syncScrollArea(!0)}clear(){if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearAllMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(let e=1;e<this.rows;e++)this.buffer.lines.push(this.buffer.getBlankLine(L.DEFAULT_ATTR_DATA));this._onScroll.fire({position:this.buffer.ydisp,source:0}),this.viewport?.reset(),this.refresh(0,this.rows-1)}}reset(){this.options.rows=this.rows,this.options.cols=this.cols;const e=this._customKeyEventHandler;this._setup(),super.reset(),this._selectionService?.reset(),this._decorationService.reset(),this.viewport?.reset(),this._customKeyEventHandler=e,this.refresh(0,this.rows-1)}clearTextureAtlas(){this._renderService?.clearTextureAtlas()}_reportFocus(){this.element?.classList.contains("focus")?this.coreService.triggerDataEvent(D.C0.ESC+"[I"):this.coreService.triggerDataEvent(D.C0.ESC+"[O")}_reportWindowsOptions(e){if(this._renderService)switch(e){case T.WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:const e=this._renderService.dimensions.css.canvas.width.toFixed(0),t=this._renderService.dimensions.css.canvas.height.toFixed(0);this.coreService.triggerDataEvent(`${D.C0.ESC}[4;${t};${e}t`);break;case T.WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:const i=this._renderService.dimensions.css.cell.width.toFixed(0),s=this._renderService.dimensions.css.cell.height.toFixed(0);this.coreService.triggerDataEvent(`${D.C0.ESC}[6;${s};${i}t`)}}cancel(e,t){if(this.options.cancelEvents||t)return e.preventDefault(),e.stopPropagation(),!1}}t.Terminal=P},9924:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TimeBasedDebouncer=void 0,t.TimeBasedDebouncer=class{constructor(e,t=1e3){this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}dispose(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)}refresh(e,t,i){this._rowCount=i,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;const s=Date.now();if(s-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=s,this._innerRefresh();else if(!this._additionalRefreshRequested){const e=s-this._lastRefreshMs,t=this._debounceThresholdMS-e;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((()=>{this._lastRefreshMs=Date.now(),this._innerRefresh(),this._additionalRefreshRequested=!1,this._refreshTimeoutID=void 0}),t)}}_innerRefresh(){if(void 0===this._rowStart||void 0===this._rowEnd||void 0===this._rowCount)return;const e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}}},1680:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.Viewport=void 0;const n=i(3656),o=i(4725),a=i(8460),h=i(844),c=i(2585);let l=t.Viewport=class extends h.Disposable{constructor(e,t,i,s,r,o,h,c){super(),this._viewportElement=e,this._scrollArea=t,this._bufferService=i,this._optionsService=s,this._charSizeService=r,this._renderService=o,this._coreBrowserService=h,this.scrollBarWidth=0,this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._wheelPartialScroll=0,this._refreshAnimationFrame=null,this._ignoreNextScrollEvent=!1,this._smoothScrollState={startTime:0,origin:-1,target:-1},this._onRequestScrollLines=this.register(new a.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this.register((0,n.addDisposableDomListener)(this._viewportElement,"scroll",this._handleScroll.bind(this))),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._renderDimensions=this._renderService.dimensions,this.register(this._renderService.onDimensionsChange((e=>this._renderDimensions=e))),this._handleThemeChange(c.colors),this.register(c.onChangeColors((e=>this._handleThemeChange(e)))),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.syncScrollArea()))),setTimeout((()=>this.syncScrollArea()))}_handleThemeChange(e){this._viewportElement.style.backgroundColor=e.background.css}reset(){this._currentRowHeight=0,this._currentDeviceCellHeight=0,this._lastRecordedBufferLength=0,this._lastRecordedViewportHeight=0,this._lastRecordedBufferHeight=0,this._lastTouchY=0,this._lastScrollTop=0,this._coreBrowserService.window.requestAnimationFrame((()=>this.syncScrollArea()))}_refresh(e){if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&this._coreBrowserService.window.cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._innerRefresh())))}_innerRefresh(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderDimensions.device.cell.height/this._coreBrowserService.dpr,this._currentDeviceCellHeight=this._renderDimensions.device.cell.height,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;const e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderDimensions.css.canvas.height);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+"px")}const e=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==e&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=e),this._refreshAnimationFrame=null}syncScrollArea(e=!1){if(this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.css.canvas.height&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.device.cell.height===this._currentDeviceCellHeight||this._refresh(e)}_handleScroll(e){if(this._lastScrollTop=this._viewportElement.scrollTop,!this._viewportElement.offsetParent)return;if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._onRequestScrollLines.fire({amount:0,suppressScrollEvent:!0});const t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._onRequestScrollLines.fire({amount:t,suppressScrollEvent:!0})}_smoothScroll(){if(this._isDisposed||-1===this._smoothScrollState.origin||-1===this._smoothScrollState.target)return;const e=this._smoothScrollPercent();this._viewportElement.scrollTop=this._smoothScrollState.origin+Math.round(e*(this._smoothScrollState.target-this._smoothScrollState.origin)),e<1?this._coreBrowserService.window.requestAnimationFrame((()=>this._smoothScroll())):this._clearSmoothScrollState()}_smoothScrollPercent(){return this._optionsService.rawOptions.smoothScrollDuration&&this._smoothScrollState.startTime?Math.max(Math.min((Date.now()-this._smoothScrollState.startTime)/this._optionsService.rawOptions.smoothScrollDuration,1),0):1}_clearSmoothScrollState(){this._smoothScrollState.startTime=0,this._smoothScrollState.origin=-1,this._smoothScrollState.target=-1}_bubbleScroll(e,t){const i=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&i<this._lastRecordedBufferHeight)||(e.cancelable&&e.preventDefault(),!1)}handleWheel(e){const t=this._getPixelsScrolled(e);return 0!==t&&(this._optionsService.rawOptions.smoothScrollDuration?(this._smoothScrollState.startTime=Date.now(),this._smoothScrollPercent()<1?(this._smoothScrollState.origin=this._viewportElement.scrollTop,-1===this._smoothScrollState.target?this._smoothScrollState.target=this._viewportElement.scrollTop+t:this._smoothScrollState.target+=t,this._smoothScrollState.target=Math.max(Math.min(this._smoothScrollState.target,this._viewportElement.scrollHeight),0),this._smoothScroll()):this._clearSmoothScrollState()):this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}scrollLines(e){if(0!==e)if(this._optionsService.rawOptions.smoothScrollDuration){const t=e*this._currentRowHeight;this._smoothScrollState.startTime=Date.now(),this._smoothScrollPercent()<1?(this._smoothScrollState.origin=this._viewportElement.scrollTop,this._smoothScrollState.target=this._smoothScrollState.origin+t,this._smoothScrollState.target=Math.max(Math.min(this._smoothScrollState.target,this._viewportElement.scrollHeight),0),this._smoothScroll()):this._clearSmoothScrollState()}else this._onRequestScrollLines.fire({amount:e,suppressScrollEvent:!1})}_getPixelsScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_LINE?t*=this._currentRowHeight:e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._currentRowHeight*this._bufferService.rows),t}getBufferElements(e,t){let i,s="";const r=[],n=t??this._bufferService.buffer.lines.length,o=this._bufferService.buffer.lines;for(let t=e;t<n;t++){const e=o.get(t);if(!e)continue;const n=o.get(t+1)?.isWrapped;if(s+=e.translateToString(!n),!n||t===o.length-1){const e=document.createElement("div");e.textContent=s,r.push(e),s.length>0&&(i=e),s=""}}return{bufferElements:r,cursorElement:i}}getLinesScrolled(e){if(0===e.deltaY||e.shiftKey)return 0;let t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t}_applyScrollModifier(e,t){const i=this._optionsService.rawOptions.fastScrollModifier;return"alt"===i&&t.altKey||"ctrl"===i&&t.ctrlKey||"shift"===i&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity}handleTouchStart(e){this._lastTouchY=e.touches[0].pageY}handleTouchMove(e){const t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))}};t.Viewport=l=s([r(2,c.IBufferService),r(3,c.IOptionsService),r(4,o.ICharSizeService),r(5,o.IRenderService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],l)},3107:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferDecorationRenderer=void 0;const n=i(4725),o=i(844),a=i(2585);let h=t.BufferDecorationRenderer=class extends o.Disposable{constructor(e,t,i,s,r){super(),this._screenElement=e,this._bufferService=t,this._coreBrowserService=i,this._decorationService=s,this._renderService=r,this._decorationElements=new Map,this._altBufferIsActive=!1,this._dimensionsChanged=!1,this._container=document.createElement("div"),this._container.classList.add("xterm-decoration-container"),this._screenElement.appendChild(this._container),this.register(this._renderService.onRenderedViewportChange((()=>this._doRefreshDecorations()))),this.register(this._renderService.onDimensionsChange((()=>{this._dimensionsChanged=!0,this._queueRefresh()}))),this.register(this._coreBrowserService.onDprChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._altBufferIsActive=this._bufferService.buffer===this._bufferService.buffers.alt}))),this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh()))),this.register(this._decorationService.onDecorationRemoved((e=>this._removeDecoration(e)))),this.register((0,o.toDisposable)((()=>{this._container.remove(),this._decorationElements.clear()})))}_queueRefresh(){void 0===this._animationFrame&&(this._animationFrame=this._renderService.addRefreshCallback((()=>{this._doRefreshDecorations(),this._animationFrame=void 0})))}_doRefreshDecorations(){for(const e of this._decorationService.decorations)this._renderDecoration(e);this._dimensionsChanged=!1}_renderDecoration(e){this._refreshStyle(e),this._dimensionsChanged&&this._refreshXPosition(e)}_createElement(e){const t=this._coreBrowserService.mainDocument.createElement("div");t.classList.add("xterm-decoration"),t.classList.toggle("xterm-decoration-top-layer","top"===e?.options?.layer),t.style.width=`${Math.round((e.options.width||1)*this._renderService.dimensions.css.cell.width)}px`,t.style.height=(e.options.height||1)*this._renderService.dimensions.css.cell.height+"px",t.style.top=(e.marker.line-this._bufferService.buffers.active.ydisp)*this._renderService.dimensions.css.cell.height+"px",t.style.lineHeight=`${this._renderService.dimensions.css.cell.height}px`;const i=e.options.x??0;return i&&i>this._bufferService.cols&&(t.style.display="none"),this._refreshXPosition(e,t),t}_refreshStyle(e){const t=e.marker.line-this._bufferService.buffers.active.ydisp;if(t<0||t>=this._bufferService.rows)e.element&&(e.element.style.display="none",e.onRenderEmitter.fire(e.element));else{let i=this._decorationElements.get(e);i||(i=this._createElement(e),e.element=i,this._decorationElements.set(e,i),this._container.appendChild(i),e.onDispose((()=>{this._decorationElements.delete(e),i.remove()}))),i.style.top=t*this._renderService.dimensions.css.cell.height+"px",i.style.display=this._altBufferIsActive?"none":"block",e.onRenderEmitter.fire(i)}}_refreshXPosition(e,t=e.element){if(!t)return;const i=e.options.x??0;"right"===(e.options.anchor||"left")?t.style.right=i?i*this._renderService.dimensions.css.cell.width+"px":"":t.style.left=i?i*this._renderService.dimensions.css.cell.width+"px":""}_removeDecoration(e){this._decorationElements.get(e)?.remove(),this._decorationElements.delete(e),e.dispose()}};t.BufferDecorationRenderer=h=s([r(1,a.IBufferService),r(2,n.ICoreBrowserService),r(3,a.IDecorationService),r(4,n.IRenderService)],h)},5871:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ColorZoneStore=void 0,t.ColorZoneStore=class{constructor(){this._zones=[],this._zonePool=[],this._zonePoolIndex=0,this._linePadding={full:0,left:0,center:0,right:0}}get zones(){return this._zonePool.length=Math.min(this._zonePool.length,this._zones.length),this._zones}clear(){this._zones.length=0,this._zonePoolIndex=0}addDecoration(e){if(e.options.overviewRulerOptions){for(const t of this._zones)if(t.color===e.options.overviewRulerOptions.color&&t.position===e.options.overviewRulerOptions.position){if(this._lineIntersectsZone(t,e.marker.line))return;if(this._lineAdjacentToZone(t,e.marker.line,e.options.overviewRulerOptions.position))return void this._addLineToZone(t,e.marker.line)}if(this._zonePoolIndex<this._zonePool.length)return this._zonePool[this._zonePoolIndex].color=e.options.overviewRulerOptions.color,this._zonePool[this._zonePoolIndex].position=e.options.overviewRulerOptions.position,this._zonePool[this._zonePoolIndex].startBufferLine=e.marker.line,this._zonePool[this._zonePoolIndex].endBufferLine=e.marker.line,void this._zones.push(this._zonePool[this._zonePoolIndex++]);this._zones.push({color:e.options.overviewRulerOptions.color,position:e.options.overviewRulerOptions.position,startBufferLine:e.marker.line,endBufferLine:e.marker.line}),this._zonePool.push(this._zones[this._zones.length-1]),this._zonePoolIndex++}}setPadding(e){this._linePadding=e}_lineIntersectsZone(e,t){return t>=e.startBufferLine&&t<=e.endBufferLine}_lineAdjacentToZone(e,t,i){return t>=e.startBufferLine-this._linePadding[i||"full"]&&t<=e.endBufferLine+this._linePadding[i||"full"]}_addLineToZone(e,t){e.startBufferLine=Math.min(e.startBufferLine,t),e.endBufferLine=Math.max(e.endBufferLine,t)}}},5744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OverviewRulerRenderer=void 0;const n=i(5871),o=i(4725),a=i(844),h=i(2585),c={full:0,left:0,center:0,right:0},l={full:0,left:0,center:0,right:0},d={full:0,left:0,center:0,right:0};let _=t.OverviewRulerRenderer=class extends a.Disposable{get _width(){return this._optionsService.options.overviewRulerWidth||0}constructor(e,t,i,s,r,o,h){super(),this._viewportElement=e,this._screenElement=t,this._bufferService=i,this._decorationService=s,this._renderService=r,this._optionsService=o,this._coreBrowserService=h,this._colorZoneStore=new n.ColorZoneStore,this._shouldUpdateDimensions=!0,this._shouldUpdateAnchor=!0,this._lastKnownBufferLength=0,this._canvas=this._coreBrowserService.mainDocument.createElement("canvas"),this._canvas.classList.add("xterm-decoration-overview-ruler"),this._refreshCanvasDimensions(),this._viewportElement.parentElement?.insertBefore(this._canvas,this._viewportElement);const c=this._canvas.getContext("2d");if(!c)throw new Error("Ctx cannot be null");this._ctx=c,this._registerDecorationListeners(),this._registerBufferChangeListeners(),this._registerDimensionChangeListeners(),this.register((0,a.toDisposable)((()=>{this._canvas?.remove()})))}_registerDecorationListeners(){this.register(this._decorationService.onDecorationRegistered((()=>this._queueRefresh(void 0,!0)))),this.register(this._decorationService.onDecorationRemoved((()=>this._queueRefresh(void 0,!0))))}_registerBufferChangeListeners(){this.register(this._renderService.onRenderedViewportChange((()=>this._queueRefresh()))),this.register(this._bufferService.buffers.onBufferActivate((()=>{this._canvas.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?"none":"block"}))),this.register(this._bufferService.onScroll((()=>{this._lastKnownBufferLength!==this._bufferService.buffers.normal.lines.length&&(this._refreshDrawHeightConstants(),this._refreshColorZonePadding())})))}_registerDimensionChangeListeners(){this.register(this._renderService.onRender((()=>{this._containerHeight&&this._containerHeight===this._screenElement.clientHeight||(this._queueRefresh(!0),this._containerHeight=this._screenElement.clientHeight)}))),this.register(this._optionsService.onSpecificOptionChange("overviewRulerWidth",(()=>this._queueRefresh(!0)))),this.register(this._coreBrowserService.onDprChange((()=>this._queueRefresh(!0)))),this._queueRefresh(!0)}_refreshDrawConstants(){const e=Math.floor(this._canvas.width/3),t=Math.ceil(this._canvas.width/3);l.full=this._canvas.width,l.left=e,l.center=t,l.right=e,this._refreshDrawHeightConstants(),d.full=0,d.left=0,d.center=l.left,d.right=l.left+l.center}_refreshDrawHeightConstants(){c.full=Math.round(2*this._coreBrowserService.dpr);const e=this._canvas.height/this._bufferService.buffer.lines.length,t=Math.round(Math.max(Math.min(e,12),6)*this._coreBrowserService.dpr);c.left=t,c.center=t,c.right=t}_refreshColorZonePadding(){this._colorZoneStore.setPadding({full:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.full),left:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.left),center:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.center),right:Math.floor(this._bufferService.buffers.active.lines.length/(this._canvas.height-1)*c.right)}),this._lastKnownBufferLength=this._bufferService.buffers.normal.lines.length}_refreshCanvasDimensions(){this._canvas.style.width=`${this._width}px`,this._canvas.width=Math.round(this._width*this._coreBrowserService.dpr),this._canvas.style.height=`${this._screenElement.clientHeight}px`,this._canvas.height=Math.round(this._screenElement.clientHeight*this._coreBrowserService.dpr),this._refreshDrawConstants(),this._refreshColorZonePadding()}_refreshDecorations(){this._shouldUpdateDimensions&&this._refreshCanvasDimensions(),this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height),this._colorZoneStore.clear();for(const e of this._decorationService.decorations)this._colorZoneStore.addDecoration(e);this._ctx.lineWidth=1;const e=this._colorZoneStore.zones;for(const t of e)"full"!==t.position&&this._renderColorZone(t);for(const t of e)"full"===t.position&&this._renderColorZone(t);this._shouldUpdateDimensions=!1,this._shouldUpdateAnchor=!1}_renderColorZone(e){this._ctx.fillStyle=e.color,this._ctx.fillRect(d[e.position||"full"],Math.round((this._canvas.height-1)*(e.startBufferLine/this._bufferService.buffers.active.lines.length)-c[e.position||"full"]/2),l[e.position||"full"],Math.round((this._canvas.height-1)*((e.endBufferLine-e.startBufferLine)/this._bufferService.buffers.active.lines.length)+c[e.position||"full"]))}_queueRefresh(e,t){this._shouldUpdateDimensions=e||this._shouldUpdateDimensions,this._shouldUpdateAnchor=t||this._shouldUpdateAnchor,void 0===this._animationFrame&&(this._animationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>{this._refreshDecorations(),this._animationFrame=void 0})))}};t.OverviewRulerRenderer=_=s([r(2,h.IBufferService),r(3,h.IDecorationService),r(4,o.IRenderService),r(5,h.IOptionsService),r(6,o.ICoreBrowserService)],_)},2950:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CompositionHelper=void 0;const n=i(4725),o=i(2585),a=i(2584);let h=t.CompositionHelper=class{get isComposing(){return this._isComposing}constructor(e,t,i,s,r,n){this._textarea=e,this._compositionView=t,this._bufferService=i,this._optionsService=s,this._coreService=r,this._renderService=n,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=""}compositionstart(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent="",this._dataAlreadySent="",this._compositionView.classList.add("active")}compositionupdate(e){this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((()=>{this._compositionPosition.end=this._textarea.value.length}),0)}compositionend(){this._finalizeComposition(!0)}keydown(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)}_finalizeComposition(e){if(this._compositionView.classList.remove("active"),this._isComposing=!1,e){const e={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((()=>{if(this._isSendingComposition){let t;this._isSendingComposition=!1,e.start+=this._dataAlreadySent.length,t=this._isComposing?this._textarea.value.substring(e.start,e.end):this._textarea.value.substring(e.start),t.length>0&&this._coreService.triggerDataEvent(t,!0)}}),0)}else{this._isSendingComposition=!1;const e=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(e,!0)}}_handleAnyTextareaChanges(){const e=this._textarea.value;setTimeout((()=>{if(!this._isComposing){const t=this._textarea.value,i=t.replace(e,"");this._dataAlreadySent=i,t.length>e.length?this._coreService.triggerDataEvent(i,!0):t.length<e.length?this._coreService.triggerDataEvent(`${a.C0.DEL}`,!0):t.length===e.length&&t!==e&&this._coreService.triggerDataEvent(t,!0)}}),0)}updateCompositionElements(e){if(this._isComposing){if(this._bufferService.buffer.isCursorInViewport){const e=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),t=this._renderService.dimensions.css.cell.height,i=this._bufferService.buffer.y*this._renderService.dimensions.css.cell.height,s=e*this._renderService.dimensions.css.cell.width;this._compositionView.style.left=s+"px",this._compositionView.style.top=i+"px",this._compositionView.style.height=t+"px",this._compositionView.style.lineHeight=t+"px",this._compositionView.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._compositionView.style.fontSize=this._optionsService.rawOptions.fontSize+"px";const r=this._compositionView.getBoundingClientRect();this._textarea.style.left=s+"px",this._textarea.style.top=i+"px",this._textarea.style.width=Math.max(r.width,1)+"px",this._textarea.style.height=Math.max(r.height,1)+"px",this._textarea.style.lineHeight=r.height+"px"}e||setTimeout((()=>this.updateCompositionElements(!0)),0)}}};t.CompositionHelper=h=s([r(2,o.IBufferService),r(3,o.IOptionsService),r(4,o.ICoreService),r(5,n.IRenderService)],h)},9806:(e,t)=>{function i(e,t,i){const s=i.getBoundingClientRect(),r=e.getComputedStyle(i),n=parseInt(r.getPropertyValue("padding-left")),o=parseInt(r.getPropertyValue("padding-top"));return[t.clientX-s.left-n,t.clientY-s.top-o]}Object.defineProperty(t,"__esModule",{value:!0}),t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=i,t.getCoords=function(e,t,s,r,n,o,a,h,c){if(!o)return;const l=i(e,t,s);return l?(l[0]=Math.ceil((l[0]+(c?a/2:0))/a),l[1]=Math.ceil(l[1]/h),l[0]=Math.min(Math.max(l[0],1),r+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l):void 0}},9504:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.moveToCellSequence=void 0;const s=i(2584);function r(e,t,i,s){const r=e-n(e,i),a=t-n(t,i),l=Math.abs(r-a)-function(e,t,i){let s=0;const r=e-n(e,i),a=t-n(t,i);for(let n=0;n<Math.abs(r-a);n++){const a="A"===o(e,t)?-1:1,h=i.buffer.lines.get(r+a*n);h?.isWrapped&&s++}return s}(e,t,i);return c(l,h(o(e,t),s))}function n(e,t){let i=0,s=t.buffer.lines.get(e),r=s?.isWrapped;for(;r&&e>=0&&e<t.rows;)i++,s=t.buffer.lines.get(--e),r=s?.isWrapped;return i}function o(e,t){return e>t?"A":"B"}function a(e,t,i,s,r,n){let o=e,a=t,h="";for(;o!==i||a!==s;)o+=r?1:-1,r&&o>n.cols-1?(h+=n.buffer.translateBufferLineToString(a,!1,e,o),o=0,e=0,a++):!r&&o<0&&(h+=n.buffer.translateBufferLineToString(a,!1,0,e+1),o=n.cols-1,e=o,a--);return h+n.buffer.translateBufferLineToString(a,!1,e,o)}function h(e,t){const i=t?"O":"[";return s.C0.ESC+i+e}function c(e,t){e=Math.floor(e);let i="";for(let s=0;s<e;s++)i+=t;return i}t.moveToCellSequence=function(e,t,i,s){const o=i.buffer.x,l=i.buffer.y;if(!i.buffer.hasScrollback)return function(e,t,i,s,o,l){return 0===r(t,s,o,l).length?"":c(a(e,t,e,t-n(t,o),!1,o).length,h("D",l))}(o,l,0,t,i,s)+r(l,t,i,s)+function(e,t,i,s,o,l){let d;d=r(t,s,o,l).length>0?s-n(s,o):t;const _=s,u=function(e,t,i,s,o,a){let h;return h=r(i,s,o,a).length>0?s-n(s,o):t,e<i&&h<=s||e>=i&&h<s?"C":"D"}(e,t,i,s,o,l);return c(a(e,d,i,_,"C"===u,o).length,h(u,l))}(o,l,e,t,i,s);let d;if(l===t)return d=o>e?"D":"C",c(Math.abs(o-e),h(d,s));d=l>t?"D":"C";const _=Math.abs(l-t);return c(function(e,t){return t.cols-e}(l>t?e:o,i)+(_-1)*i.cols+1+((l>t?o:e)-1),h(d,s))}},1296:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRenderer=void 0;const n=i(3787),o=i(2550),a=i(2223),h=i(6171),c=i(6052),l=i(4725),d=i(8055),_=i(8460),u=i(844),f=i(2585),v="xterm-dom-renderer-owner-",p="xterm-rows",g="xterm-fg-",m="xterm-bg-",S="xterm-focus",C="xterm-selection";let b=1,w=t.DomRenderer=class extends u.Disposable{constructor(e,t,i,s,r,a,l,d,f,g,m,S,w){super(),this._terminal=e,this._document=t,this._element=i,this._screenElement=s,this._viewportElement=r,this._helperContainer=a,this._linkifier2=l,this._charSizeService=f,this._optionsService=g,this._bufferService=m,this._coreBrowserService=S,this._themeService=w,this._terminalClass=b++,this._rowElements=[],this._selectionRenderModel=(0,c.createSelectionRenderModel)(),this.onRequestRedraw=this.register(new _.EventEmitter).event,this._rowContainer=this._document.createElement("div"),this._rowContainer.classList.add(p),this._rowContainer.style.lineHeight="normal",this._rowContainer.setAttribute("aria-hidden","true"),this._refreshRowElements(this._bufferService.cols,this._bufferService.rows),this._selectionContainer=this._document.createElement("div"),this._selectionContainer.classList.add(C),this._selectionContainer.setAttribute("aria-hidden","true"),this.dimensions=(0,h.createRenderDimensions)(),this._updateDimensions(),this.register(this._optionsService.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._themeService.onChangeColors((e=>this._injectCss(e)))),this._injectCss(this._themeService.colors),this._rowFactory=d.createInstance(n.DomRendererRowFactory,document),this._element.classList.add(v+this._terminalClass),this._screenElement.appendChild(this._rowContainer),this._screenElement.appendChild(this._selectionContainer),this.register(this._linkifier2.onShowLinkUnderline((e=>this._handleLinkHover(e)))),this.register(this._linkifier2.onHideLinkUnderline((e=>this._handleLinkLeave(e)))),this.register((0,u.toDisposable)((()=>{this._element.classList.remove(v+this._terminalClass),this._rowContainer.remove(),this._selectionContainer.remove(),this._widthCache.dispose(),this._themeStyleElement.remove(),this._dimensionsStyleElement.remove()}))),this._widthCache=new o.WidthCache(this._document,this._helperContainer),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}_updateDimensions(){const e=this._coreBrowserService.dpr;this.dimensions.device.char.width=this._charSizeService.width*e,this.dimensions.device.char.height=Math.ceil(this._charSizeService.height*e),this.dimensions.device.cell.width=this.dimensions.device.char.width+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.device.cell.height=Math.floor(this.dimensions.device.char.height*this._optionsService.rawOptions.lineHeight),this.dimensions.device.char.left=0,this.dimensions.device.char.top=0,this.dimensions.device.canvas.width=this.dimensions.device.cell.width*this._bufferService.cols,this.dimensions.device.canvas.height=this.dimensions.device.cell.height*this._bufferService.rows,this.dimensions.css.canvas.width=Math.round(this.dimensions.device.canvas.width/e),this.dimensions.css.canvas.height=Math.round(this.dimensions.device.canvas.height/e),this.dimensions.css.cell.width=this.dimensions.css.canvas.width/this._bufferService.cols,this.dimensions.css.cell.height=this.dimensions.css.canvas.height/this._bufferService.rows;for(const e of this._rowElements)e.style.width=`${this.dimensions.css.canvas.width}px`,e.style.height=`${this.dimensions.css.cell.height}px`,e.style.lineHeight=`${this.dimensions.css.cell.height}px`,e.style.overflow="hidden";this._dimensionsStyleElement||(this._dimensionsStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._dimensionsStyleElement));const t=`${this._terminalSelector} .${p} span { display: inline-block; height: 100%; vertical-align: top;}`;this._dimensionsStyleElement.textContent=t,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=`${this.dimensions.css.canvas.width}px`,this._screenElement.style.height=`${this.dimensions.css.canvas.height}px`}_injectCss(e){this._themeStyleElement||(this._themeStyleElement=this._document.createElement("style"),this._screenElement.appendChild(this._themeStyleElement));let t=`${this._terminalSelector} .${p} { color: ${e.foreground.css}; font-family: ${this._optionsService.rawOptions.fontFamily}; font-size: ${this._optionsService.rawOptions.fontSize}px; font-kerning: none; white-space: pre}`;t+=`${this._terminalSelector} .${p} .xterm-dim { color: ${d.color.multiplyOpacity(e.foreground,.5).css};}`,t+=`${this._terminalSelector} span:not(.xterm-bold) { font-weight: ${this._optionsService.rawOptions.fontWeight};}${this._terminalSelector} span.xterm-bold { font-weight: ${this._optionsService.rawOptions.fontWeightBold};}${this._terminalSelector} span.xterm-italic { font-style: italic;}`;const i=`blink_underline_${this._terminalClass}`,s=`blink_bar_${this._terminalClass}`,r=`blink_block_${this._terminalClass}`;t+=`@keyframes ${i} { 50% { border-bottom-style: hidden; }}`,t+=`@keyframes ${s} { 50% { box-shadow: none; }}`,t+=`@keyframes ${r} { 0% { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css}; } 50% { background-color: inherit; color: ${e.cursor.css}; }}`,t+=`${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-underline { animation: ${i} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-bar { animation: ${s} 1s step-end infinite;}${this._terminalSelector} .${p}.${S} .xterm-cursor.xterm-cursor-blink.xterm-cursor-block { animation: ${r} 1s step-end infinite;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block { background-color: ${e.cursor.css}; color: ${e.cursorAccent.css};}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-block:not(.xterm-cursor-blink) { background-color: ${e.cursor.css} !important; color: ${e.cursorAccent.css} !important;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-outline { outline: 1px solid ${e.cursor.css}; outline-offset: -1px;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-bar { box-shadow: ${this._optionsService.rawOptions.cursorWidth}px 0 0 ${e.cursor.css} inset;}${this._terminalSelector} .${p} .xterm-cursor.xterm-cursor-underline { border-bottom: 1px ${e.cursor.css}; border-bottom-style: solid; height: calc(100% - 1px);}`,t+=`${this._terminalSelector} .${C} { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}${this._terminalSelector}.focus .${C} div { position: absolute; background-color: ${e.selectionBackgroundOpaque.css};}${this._terminalSelector} .${C} div { position: absolute; background-color: ${e.selectionInactiveBackgroundOpaque.css};}`;for(const[i,s]of e.ansi.entries())t+=`${this._terminalSelector} .${g}${i} { color: ${s.css}; }${this._terminalSelector} .${g}${i}.xterm-dim { color: ${d.color.multiplyOpacity(s,.5).css}; }${this._terminalSelector} .${m}${i} { background-color: ${s.css}; }`;t+=`${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR} { color: ${d.color.opaque(e.background).css}; }${this._terminalSelector} .${g}${a.INVERTED_DEFAULT_COLOR}.xterm-dim { color: ${d.color.multiplyOpacity(d.color.opaque(e.background),.5).css}; }${this._terminalSelector} .${m}${a.INVERTED_DEFAULT_COLOR} { background-color: ${e.foreground.css}; }`,this._themeStyleElement.textContent=t}_setDefaultSpacing(){const e=this.dimensions.css.cell.width-this._widthCache.get("W",!1,!1);this._rowContainer.style.letterSpacing=`${e}px`,this._rowFactory.defaultSpacing=e}handleDevicePixelRatioChange(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}_refreshRowElements(e,t){for(let e=this._rowElements.length;e<=t;e++){const e=this._document.createElement("div");this._rowContainer.appendChild(e),this._rowElements.push(e)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())}handleResize(e,t){this._refreshRowElements(e,t),this._updateDimensions(),this.handleSelectionChanged(this._selectionRenderModel.selectionStart,this._selectionRenderModel.selectionEnd,this._selectionRenderModel.columnSelectMode)}handleCharSizeChanged(){this._updateDimensions(),this._widthCache.clear(),this._setDefaultSpacing()}handleBlur(){this._rowContainer.classList.remove(S),this.renderRows(0,this._bufferService.rows-1)}handleFocus(){this._rowContainer.classList.add(S),this.renderRows(this._bufferService.buffer.y,this._bufferService.buffer.y)}handleSelectionChanged(e,t,i){if(this._selectionContainer.replaceChildren(),this._rowFactory.handleSelectionChanged(e,t,i),this.renderRows(0,this._bufferService.rows-1),!e||!t)return;this._selectionRenderModel.update(this._terminal,e,t,i);const s=this._selectionRenderModel.viewportStartRow,r=this._selectionRenderModel.viewportEndRow,n=this._selectionRenderModel.viewportCappedStartRow,o=this._selectionRenderModel.viewportCappedEndRow;if(n>=this._bufferService.rows||o<0)return;const a=this._document.createDocumentFragment();if(i){const i=e[0]>t[0];a.appendChild(this._createSelectionElement(n,i?t[0]:e[0],i?e[0]:t[0],o-n+1))}else{const i=s===n?e[0]:0,h=n===r?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(n,i,h));const c=o-n-1;if(a.appendChild(this._createSelectionElement(n+1,0,this._bufferService.cols,c)),n!==o){const e=r===o?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,0,e))}}this._selectionContainer.appendChild(a)}_createSelectionElement(e,t,i,s=1){const r=this._document.createElement("div"),n=t*this.dimensions.css.cell.width;let o=this.dimensions.css.cell.width*(i-t);return n+o>this.dimensions.css.canvas.width&&(o=this.dimensions.css.canvas.width-n),r.style.height=s*this.dimensions.css.cell.height+"px",r.style.top=e*this.dimensions.css.cell.height+"px",r.style.left=`${n}px`,r.style.width=`${o}px`,r}handleCursorMove(){}_handleOptionsChanged(){this._updateDimensions(),this._injectCss(this._themeService.colors),this._widthCache.setFont(this._optionsService.rawOptions.fontFamily,this._optionsService.rawOptions.fontSize,this._optionsService.rawOptions.fontWeight,this._optionsService.rawOptions.fontWeightBold),this._setDefaultSpacing()}clear(){for(const e of this._rowElements)e.replaceChildren()}renderRows(e,t){const i=this._bufferService.buffer,s=i.ybase+i.y,r=Math.min(i.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=this._optionsService.rawOptions.cursorStyle,a=this._optionsService.rawOptions.cursorInactiveStyle;for(let h=e;h<=t;h++){const e=h+i.ydisp,t=this._rowElements[h],c=i.lines.get(e);if(!t||!c)break;t.replaceChildren(...this._rowFactory.createRow(c,e,e===s,o,a,r,n,this.dimensions.css.cell.width,this._widthCache,-1,-1))}}get _terminalSelector(){return`.${v}${this._terminalClass}`}_handleLinkHover(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)}_handleLinkLeave(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)}_setCellUnderline(e,t,i,s,r,n){i<0&&(e=0),s<0&&(t=0);const o=this._bufferService.rows-1;i=Math.max(Math.min(i,o),0),s=Math.max(Math.min(s,o),0),r=Math.min(r,this._bufferService.cols);const a=this._bufferService.buffer,h=a.ybase+a.y,c=Math.min(a.x,r-1),l=this._optionsService.rawOptions.cursorBlink,d=this._optionsService.rawOptions.cursorStyle,_=this._optionsService.rawOptions.cursorInactiveStyle;for(let o=i;o<=s;++o){const u=o+a.ydisp,f=this._rowElements[o],v=a.lines.get(u);if(!f||!v)break;f.replaceChildren(...this._rowFactory.createRow(v,u,u===h,d,_,c,l,this.dimensions.css.cell.width,this._widthCache,n?o===i?e:0:-1,n?(o===s?t:r)-1:-1))}}};t.DomRenderer=w=s([r(7,f.IInstantiationService),r(8,l.ICharSizeService),r(9,f.IOptionsService),r(10,f.IBufferService),r(11,l.ICoreBrowserService),r(12,l.IThemeService)],w)},3787:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.DomRendererRowFactory=void 0;const n=i(2223),o=i(643),a=i(511),h=i(2585),c=i(8055),l=i(4725),d=i(4269),_=i(6171),u=i(3734);let f=t.DomRendererRowFactory=class{constructor(e,t,i,s,r,n,o){this._document=e,this._characterJoinerService=t,this._optionsService=i,this._coreBrowserService=s,this._coreService=r,this._decorationService=n,this._themeService=o,this._workCell=new a.CellData,this._columnSelectMode=!1,this.defaultSpacing=0}handleSelectionChanged(e,t,i){this._selectionStart=e,this._selectionEnd=t,this._columnSelectMode=i}createRow(e,t,i,s,r,a,h,l,_,f,p){const g=[],m=this._characterJoinerService.getJoinedCharacters(t),S=this._themeService.colors;let C,b=e.getNoBgTrimmedLength();i&&b<a+1&&(b=a+1);let w=0,y="",E=0,k=0,L=0,D=!1,R=0,x=!1,A=0;const B=[],T=-1!==f&&-1!==p;for(let M=0;M<b;M++){e.loadCell(M,this._workCell);let b=this._workCell.getWidth();if(0===b)continue;let O=!1,P=M,I=this._workCell;if(m.length>0&&M===m[0][0]){O=!0;const t=m.shift();I=new d.JoinedCellData(this._workCell,e.translateToString(!0,t[0],t[1]),t[1]-t[0]),P=t[1]-1,b=I.getWidth()}const H=this._isCellInSelection(M,t),F=i&&M===a,W=T&&M>=f&&M<=p;let U=!1;this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{U=!0}));let N=I.getChars()||o.WHITESPACE_CELL_CHAR;if(" "===N&&(I.isUnderline()||I.isOverline())&&(N=" "),A=b*l-_.get(N,I.isBold(),I.isItalic()),C){if(w&&(H&&x||!H&&!x&&I.bg===E)&&(H&&x&&S.selectionForeground||I.fg===k)&&I.extended.ext===L&&W===D&&A===R&&!F&&!O&&!U){I.isInvisible()?y+=o.WHITESPACE_CELL_CHAR:y+=N,w++;continue}w&&(C.textContent=y),C=this._document.createElement("span"),w=0,y=""}else C=this._document.createElement("span");if(E=I.bg,k=I.fg,L=I.extended.ext,D=W,R=A,x=H,O&&a>=M&&a<=P&&(a=M),!this._coreService.isCursorHidden&&F&&this._coreService.isCursorInitialized)if(B.push("xterm-cursor"),this._coreBrowserService.isFocused)h&&B.push("xterm-cursor-blink"),B.push("bar"===s?"xterm-cursor-bar":"underline"===s?"xterm-cursor-underline":"xterm-cursor-block");else if(r)switch(r){case"outline":B.push("xterm-cursor-outline");break;case"block":B.push("xterm-cursor-block");break;case"bar":B.push("xterm-cursor-bar");break;case"underline":B.push("xterm-cursor-underline")}if(I.isBold()&&B.push("xterm-bold"),I.isItalic()&&B.push("xterm-italic"),I.isDim()&&B.push("xterm-dim"),y=I.isInvisible()?o.WHITESPACE_CELL_CHAR:I.getChars()||o.WHITESPACE_CELL_CHAR,I.isUnderline()&&(B.push(`xterm-underline-${I.extended.underlineStyle}`)," "===y&&(y=" "),!I.isUnderlineColorDefault()))if(I.isUnderlineColorRGB())C.style.textDecorationColor=`rgb(${u.AttributeData.toColorRGB(I.getUnderlineColor()).join(",")})`;else{let e=I.getUnderlineColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&I.isBold()&&e<8&&(e+=8),C.style.textDecorationColor=S.ansi[e].css}I.isOverline()&&(B.push("xterm-overline")," "===y&&(y=" ")),I.isStrikethrough()&&B.push("xterm-strikethrough"),W&&(C.style.textDecoration="underline");let $=I.getFgColor(),j=I.getFgColorMode(),z=I.getBgColor(),K=I.getBgColorMode();const q=!!I.isInverse();if(q){const e=$;$=z,z=e;const t=j;j=K,K=t}let V,G,X,J=!1;switch(this._decorationService.forEachDecorationAtCell(M,t,void 0,(e=>{"top"!==e.options.layer&&J||(e.backgroundColorRGB&&(K=50331648,z=e.backgroundColorRGB.rgba>>8&16777215,V=e.backgroundColorRGB),e.foregroundColorRGB&&(j=50331648,$=e.foregroundColorRGB.rgba>>8&16777215,G=e.foregroundColorRGB),J="top"===e.options.layer)})),!J&&H&&(V=this._coreBrowserService.isFocused?S.selectionBackgroundOpaque:S.selectionInactiveBackgroundOpaque,z=V.rgba>>8&16777215,K=50331648,J=!0,S.selectionForeground&&(j=50331648,$=S.selectionForeground.rgba>>8&16777215,G=S.selectionForeground)),J&&B.push("xterm-decoration-top"),K){case 16777216:case 33554432:X=S.ansi[z],B.push(`xterm-bg-${z}`);break;case 50331648:X=c.channels.toColor(z>>16,z>>8&255,255&z),this._addStyle(C,`background-color:#${v((z>>>0).toString(16),"0",6)}`);break;default:q?(X=S.foreground,B.push(`xterm-bg-${n.INVERTED_DEFAULT_COLOR}`)):X=S.background}switch(V||I.isDim()&&(V=c.color.multiplyOpacity(X,.5)),j){case 16777216:case 33554432:I.isBold()&&$<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&($+=8),this._applyMinimumContrast(C,X,S.ansi[$],I,V,void 0)||B.push(`xterm-fg-${$}`);break;case 50331648:const e=c.channels.toColor($>>16&255,$>>8&255,255&$);this._applyMinimumContrast(C,X,e,I,V,G)||this._addStyle(C,`color:#${v($.toString(16),"0",6)}`);break;default:this._applyMinimumContrast(C,X,S.foreground,I,V,G)||q&&B.push(`xterm-fg-${n.INVERTED_DEFAULT_COLOR}`)}B.length&&(C.className=B.join(" "),B.length=0),F||O||U?C.textContent=y:w++,A!==this.defaultSpacing&&(C.style.letterSpacing=`${A}px`),g.push(C),M=P}return C&&w&&(C.textContent=y),g}_applyMinimumContrast(e,t,i,s,r,n){if(1===this._optionsService.rawOptions.minimumContrastRatio||(0,_.treatGlyphAsBackgroundColor)(s.getCode()))return!1;const o=this._getContrastCache(s);let a;if(r||n||(a=o.getColor(t.rgba,i.rgba)),void 0===a){const e=this._optionsService.rawOptions.minimumContrastRatio/(s.isDim()?2:1);a=c.color.ensureContrastRatio(r||t,n||i,e),o.setColor((r||t).rgba,(n||i).rgba,a??null)}return!!a&&(this._addStyle(e,`color:${a.css}`),!0)}_getContrastCache(e){return e.isDim()?this._themeService.colors.halfContrastCache:this._themeService.colors.contrastCache}_addStyle(e,t){e.setAttribute("style",`${e.getAttribute("style")||""}${t};`)}_isCellInSelection(e,t){const i=this._selectionStart,s=this._selectionEnd;return!(!i||!s)&&(this._columnSelectMode?i[0]<=s[0]?e>=i[0]&&t>=i[1]&&e<s[0]&&t<=s[1]:e<i[0]&&t>=i[1]&&e>=s[0]&&t<=s[1]:t>i[1]&&t<s[1]||i[1]===s[1]&&t===i[1]&&e>=i[0]&&e<s[0]||i[1]<s[1]&&t===s[1]&&e<s[0]||i[1]<s[1]&&t===i[1]&&e>=i[0])}};function v(e,t,i){for(;e.length<i;)e=t+e;return e}t.DomRendererRowFactory=f=s([r(1,l.ICharacterJoinerService),r(2,h.IOptionsService),r(3,l.ICoreBrowserService),r(4,h.ICoreService),r(5,h.IDecorationService),r(6,l.IThemeService)],f)},2550:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WidthCache=void 0,t.WidthCache=class{constructor(e,t){this._flat=new Float32Array(256),this._font="",this._fontSize=0,this._weight="normal",this._weightBold="bold",this._measureElements=[],this._container=e.createElement("div"),this._container.classList.add("xterm-width-cache-measure-container"),this._container.setAttribute("aria-hidden","true"),this._container.style.whiteSpace="pre",this._container.style.fontKerning="none";const i=e.createElement("span");i.classList.add("xterm-char-measure-element");const s=e.createElement("span");s.classList.add("xterm-char-measure-element"),s.style.fontWeight="bold";const r=e.createElement("span");r.classList.add("xterm-char-measure-element"),r.style.fontStyle="italic";const n=e.createElement("span");n.classList.add("xterm-char-measure-element"),n.style.fontWeight="bold",n.style.fontStyle="italic",this._measureElements=[i,s,r,n],this._container.appendChild(i),this._container.appendChild(s),this._container.appendChild(r),this._container.appendChild(n),t.appendChild(this._container),this.clear()}dispose(){this._container.remove(),this._measureElements.length=0,this._holey=void 0}clear(){this._flat.fill(-9999),this._holey=new Map}setFont(e,t,i,s){e===this._font&&t===this._fontSize&&i===this._weight&&s===this._weightBold||(this._font=e,this._fontSize=t,this._weight=i,this._weightBold=s,this._container.style.fontFamily=this._font,this._container.style.fontSize=`${this._fontSize}px`,this._measureElements[0].style.fontWeight=`${i}`,this._measureElements[1].style.fontWeight=`${s}`,this._measureElements[2].style.fontWeight=`${i}`,this._measureElements[3].style.fontWeight=`${s}`,this.clear())}get(e,t,i){let s=0;if(!t&&!i&&1===e.length&&(s=e.charCodeAt(0))<256){if(-9999!==this._flat[s])return this._flat[s];const t=this._measure(e,0);return t>0&&(this._flat[s]=t),t}let r=e;t&&(r+="B"),i&&(r+="I");let n=this._holey.get(r);if(void 0===n){let s=0;t&&(s|=1),i&&(s|=2),n=this._measure(e,s),n>0&&this._holey.set(r,n)}return n}_measure(e,t){const i=this._measureElements[t];return i.textContent=e.repeat(32),i.offsetWidth/32}}},2223:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;const s=i(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=s.isFirefox||s.isLegacyEdge?"bottom":"ideographic"},6171:(e,t)=>{function i(e){return 57508<=e&&e<=57558}function s(e){return e>=128512&&e<=128591||e>=127744&&e<=128511||e>=128640&&e<=128767||e>=9728&&e<=9983||e>=9984&&e<=10175||e>=65024&&e<=65039||e>=129280&&e<=129535||e>=127462&&e<=127487}Object.defineProperty(t,"__esModule",{value:!0}),t.computeNextVariantOffset=t.createRenderDimensions=t.treatGlyphAsBackgroundColor=t.allowRescaling=t.isEmoji=t.isRestrictedPowerlineGlyph=t.isPowerlineGlyph=t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error("value must not be falsy");return e},t.isPowerlineGlyph=i,t.isRestrictedPowerlineGlyph=function(e){return 57520<=e&&e<=57527},t.isEmoji=s,t.allowRescaling=function(e,t,r,n){return 1===t&&r>Math.ceil(1.5*n)&&void 0!==e&&e>255&&!s(e)&&!i(e)&&!function(e){return 57344<=e&&e<=63743}(e)},t.treatGlyphAsBackgroundColor=function(e){return i(e)||function(e){return 9472<=e&&e<=9631}(e)},t.createRenderDimensions=function(){return{css:{canvas:{width:0,height:0},cell:{width:0,height:0}},device:{canvas:{width:0,height:0},cell:{width:0,height:0},char:{width:0,height:0,left:0,top:0}}}},t.computeNextVariantOffset=function(e,t,i=0){return(e-(2*Math.round(t)-i))%(2*Math.round(t))}},6052:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createSelectionRenderModel=void 0;class i{constructor(){this.clear()}clear(){this.hasSelection=!1,this.columnSelectMode=!1,this.viewportStartRow=0,this.viewportEndRow=0,this.viewportCappedStartRow=0,this.viewportCappedEndRow=0,this.startCol=0,this.endCol=0,this.selectionStart=void 0,this.selectionEnd=void 0}update(e,t,i,s=!1){if(this.selectionStart=t,this.selectionEnd=i,!t||!i||t[0]===i[0]&&t[1]===i[1])return void this.clear();const r=e.buffers.active.ydisp,n=t[1]-r,o=i[1]-r,a=Math.max(n,0),h=Math.min(o,e.rows-1);a>=e.rows||h<0?this.clear():(this.hasSelection=!0,this.columnSelectMode=s,this.viewportStartRow=n,this.viewportEndRow=o,this.viewportCappedStartRow=a,this.viewportCappedEndRow=h,this.startCol=t[0],this.endCol=i[0])}isCellSelected(e,t,i){return!!this.hasSelection&&(i-=e.buffer.active.viewportY,this.columnSelectMode?this.startCol<=this.endCol?t>=this.startCol&&i>=this.viewportCappedStartRow&&t<this.endCol&&i<=this.viewportCappedEndRow:t<this.startCol&&i>=this.viewportCappedStartRow&&t>=this.endCol&&i<=this.viewportCappedEndRow:i>this.viewportStartRow&&i<this.viewportEndRow||this.viewportStartRow===this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportEndRow&&t<this.endCol||this.viewportStartRow<this.viewportEndRow&&i===this.viewportStartRow&&t>=this.startCol)}}t.createSelectionRenderModel=function(){return new i}},456:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionModel=void 0,t.SelectionModel=class{constructor(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}clearSelection(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0}get finalSelectionStart(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart}get finalSelectionEnd(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}if(this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]){const e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[Math.max(e,this.selectionEnd[0]),this.selectionEnd[1]]}return this.selectionEnd}}areSelectionValuesReversed(){const e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])}handleTrim(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)}}},428:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharSizeService=void 0;const n=i(2585),o=i(8460),a=i(844);let h=t.CharSizeService=class extends a.Disposable{get hasValidSize(){return this.width>0&&this.height>0}constructor(e,t,i){super(),this._optionsService=i,this.width=0,this.height=0,this._onCharSizeChange=this.register(new o.EventEmitter),this.onCharSizeChange=this._onCharSizeChange.event;try{this._measureStrategy=this.register(new d(this._optionsService))}catch{this._measureStrategy=this.register(new l(e,t,this._optionsService))}this.register(this._optionsService.onMultipleOptionChange(["fontFamily","fontSize"],(()=>this.measure())))}measure(){const e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())}};t.CharSizeService=h=s([r(2,n.IOptionsService)],h);class c extends a.Disposable{constructor(){super(...arguments),this._result={width:0,height:0}}_validateAndSet(e,t){void 0!==e&&e>0&&void 0!==t&&t>0&&(this._result.width=e,this._result.height=t)}}class l extends c{constructor(e,t,i){super(),this._document=e,this._parentElement=t,this._optionsService=i,this._measureElement=this._document.createElement("span"),this._measureElement.classList.add("xterm-char-measure-element"),this._measureElement.textContent="W".repeat(32),this._measureElement.setAttribute("aria-hidden","true"),this._measureElement.style.whiteSpace="pre",this._measureElement.style.fontKerning="none",this._parentElement.appendChild(this._measureElement)}measure(){return this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=`${this._optionsService.rawOptions.fontSize}px`,this._validateAndSet(Number(this._measureElement.offsetWidth)/32,Number(this._measureElement.offsetHeight)),this._result}}class d extends c{constructor(e){super(),this._optionsService=e,this._canvas=new OffscreenCanvas(100,100),this._ctx=this._canvas.getContext("2d");const t=this._ctx.measureText("W");if(!("width"in t&&"fontBoundingBoxAscent"in t&&"fontBoundingBoxDescent"in t))throw new Error("Required font metrics not supported")}measure(){this._ctx.font=`${this._optionsService.rawOptions.fontSize}px ${this._optionsService.rawOptions.fontFamily}`;const e=this._ctx.measureText("W");return this._validateAndSet(e.width,e.fontBoundingBoxAscent+e.fontBoundingBoxDescent),this._result}}},4269:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;const n=i(3734),o=i(643),a=i(511),h=i(2585);class c extends n.AttributeData{constructor(e,t,i){super(),this.content=0,this.combinedData="",this.fg=e.fg,this.bg=e.bg,this.combinedData=t,this._width=i}isCombined(){return 2097152}getWidth(){return this._width}getChars(){return this.combinedData}getCode(){return 2097151}setFromCharData(e){throw new Error("not implemented")}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.JoinedCellData=c;let l=t.CharacterJoinerService=class e{constructor(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new a.CellData}register(e){const t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id}deregister(e){for(let t=0;t<this._characterJoiners.length;t++)if(this._characterJoiners[t].id===e)return this._characterJoiners.splice(t,1),!0;return!1}getJoinedCharacters(e){if(0===this._characterJoiners.length)return[];const t=this._bufferService.buffer.lines.get(e);if(!t||0===t.length)return[];const i=[],s=t.translateToString(!0);let r=0,n=0,a=0,h=t.getFg(0),c=t.getBg(0);for(let e=0;e<t.getTrimmedLength();e++)if(t.loadCell(e,this._workCell),0!==this._workCell.getWidth()){if(this._workCell.fg!==h||this._workCell.bg!==c){if(e-r>1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t<e.length;t++)i.push(e[t])}r=e,a=n,h=this._workCell.fg,c=this._workCell.bg}n+=this._workCell.getChars().length||o.WHITESPACE_CELL_CHAR.length}if(this._bufferService.cols-r>1){const e=this._getJoinedRanges(s,a,n,t,r);for(let t=0;t<e.length;t++)i.push(e[t])}return i}_getJoinedRanges(t,i,s,r,n){const o=t.substring(i,s);let a=[];try{a=this._characterJoiners[0].handler(o)}catch(e){console.error(e)}for(let t=1;t<this._characterJoiners.length;t++)try{const i=this._characterJoiners[t].handler(o);for(let t=0;t<i.length;t++)e._mergeRanges(a,i[t])}catch(e){console.error(e)}return this._stringRangesToCellRanges(a,r,n),a}_stringRangesToCellRanges(e,t,i){let s=0,r=!1,n=0,a=e[s];if(a){for(let h=i;h<this._bufferService.cols;h++){const i=t.getWidth(h),c=t.getString(h).length||o.WHITESPACE_CELL_CHAR.length;if(0!==i){if(!r&&a[0]<=n&&(a[0]=h,r=!0),a[1]<=n){if(a[1]=h,a=e[++s],!a)break;a[0]<=n?(a[0]=h,r=!0):r=!1}n+=c}}a&&(a[1]=this._bufferService.cols)}}static _mergeRanges(e,t){let i=!1;for(let s=0;s<e.length;s++){const r=e[s];if(i){if(t[1]<=r[0])return e[s-1][1]=t[1],e;if(t[1]<=r[1])return e[s-1][1]=Math.max(t[1],r[1]),e.splice(s,1),e;e.splice(s,1),s--}else{if(t[1]<=r[0])return e.splice(s,0,t),e;if(t[1]<=r[1])return r[0]=Math.min(t[0],r[0]),e;t[0]<r[1]&&(r[0]=Math.min(t[0],r[0]),i=!0)}}return i?e[e.length-1][1]=t[1]:e.push(t),e}};t.CharacterJoinerService=l=s([r(0,h.IBufferService)],l)},5114:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreBrowserService=void 0;const s=i(844),r=i(8460),n=i(3656);class o extends s.Disposable{constructor(e,t,i){super(),this._textarea=e,this._window=t,this.mainDocument=i,this._isFocused=!1,this._cachedIsFocused=void 0,this._screenDprMonitor=new a(this._window),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._onWindowChange=this.register(new r.EventEmitter),this.onWindowChange=this._onWindowChange.event,this.register(this.onWindowChange((e=>this._screenDprMonitor.setWindow(e)))),this.register((0,r.forwardEvent)(this._screenDprMonitor.onDprChange,this._onDprChange)),this._textarea.addEventListener("focus",(()=>this._isFocused=!0)),this._textarea.addEventListener("blur",(()=>this._isFocused=!1))}get window(){return this._window}set window(e){this._window!==e&&(this._window=e,this._onWindowChange.fire(this._window))}get dpr(){return this.window.devicePixelRatio}get isFocused(){return void 0===this._cachedIsFocused&&(this._cachedIsFocused=this._isFocused&&this._textarea.ownerDocument.hasFocus(),queueMicrotask((()=>this._cachedIsFocused=void 0))),this._cachedIsFocused}}t.CoreBrowserService=o;class a extends s.Disposable{constructor(e){super(),this._parentWindow=e,this._windowResizeListener=this.register(new s.MutableDisposable),this._onDprChange=this.register(new r.EventEmitter),this.onDprChange=this._onDprChange.event,this._outerListener=()=>this._setDprAndFireIfDiffers(),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._updateDpr(),this._setWindowResizeListener(),this.register((0,s.toDisposable)((()=>this.clearListener())))}setWindow(e){this._parentWindow=e,this._setWindowResizeListener(),this._setDprAndFireIfDiffers()}_setWindowResizeListener(){this._windowResizeListener.value=(0,n.addDisposableDomListener)(this._parentWindow,"resize",(()=>this._setDprAndFireIfDiffers()))}_setDprAndFireIfDiffers(){this._parentWindow.devicePixelRatio!==this._currentDevicePixelRatio&&this._onDprChange.fire(this._parentWindow.devicePixelRatio),this._updateDpr()}_updateDpr(){this._outerListener&&(this._resolutionMediaMatchList?.removeListener(this._outerListener),this._currentDevicePixelRatio=this._parentWindow.devicePixelRatio,this._resolutionMediaMatchList=this._parentWindow.matchMedia(`screen and (resolution: ${this._parentWindow.devicePixelRatio}dppx)`),this._resolutionMediaMatchList.addListener(this._outerListener))}clearListener(){this._resolutionMediaMatchList&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._outerListener=void 0)}}},779:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.LinkProviderService=void 0;const s=i(844);class r extends s.Disposable{constructor(){super(),this.linkProviders=[],this.register((0,s.toDisposable)((()=>this.linkProviders.length=0)))}registerLinkProvider(e){return this.linkProviders.push(e),{dispose:()=>{const t=this.linkProviders.indexOf(e);-1!==t&&this.linkProviders.splice(t,1)}}}}t.LinkProviderService=r},8934:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.MouseService=void 0;const n=i(4725),o=i(9806);let a=t.MouseService=class{constructor(e,t){this._renderService=e,this._charSizeService=t}getCoords(e,t,i,s,r){return(0,o.getCoords)(window,e,t,i,s,this._charSizeService.hasValidSize,this._renderService.dimensions.css.cell.width,this._renderService.dimensions.css.cell.height,r)}getMouseReportCoords(e,t){const i=(0,o.getCoordsRelativeToElement)(window,e,t);if(this._charSizeService.hasValidSize)return i[0]=Math.min(Math.max(i[0],0),this._renderService.dimensions.css.canvas.width-1),i[1]=Math.min(Math.max(i[1],0),this._renderService.dimensions.css.canvas.height-1),{col:Math.floor(i[0]/this._renderService.dimensions.css.cell.width),row:Math.floor(i[1]/this._renderService.dimensions.css.cell.height),x:Math.floor(i[0]),y:Math.floor(i[1])}}};t.MouseService=a=s([r(0,n.IRenderService),r(1,n.ICharSizeService)],a)},3230:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.RenderService=void 0;const n=i(6193),o=i(4725),a=i(8460),h=i(844),c=i(7226),l=i(2585);let d=t.RenderService=class extends h.Disposable{get dimensions(){return this._renderer.value.dimensions}constructor(e,t,i,s,r,o,l,d){super(),this._rowCount=e,this._charSizeService=s,this._renderer=this.register(new h.MutableDisposable),this._pausedResizeTask=new c.DebouncedIdleTask,this._observerDisposable=this.register(new h.MutableDisposable),this._isPaused=!1,this._needsFullRefresh=!1,this._isNextRenderRedrawOnly=!0,this._needsSelectionRefresh=!1,this._canvasWidth=0,this._canvasHeight=0,this._selectionState={start:void 0,end:void 0,columnSelectMode:!1},this._onDimensionsChange=this.register(new a.EventEmitter),this.onDimensionsChange=this._onDimensionsChange.event,this._onRenderedViewportChange=this.register(new a.EventEmitter),this.onRenderedViewportChange=this._onRenderedViewportChange.event,this._onRender=this.register(new a.EventEmitter),this.onRender=this._onRender.event,this._onRefreshRequest=this.register(new a.EventEmitter),this.onRefreshRequest=this._onRefreshRequest.event,this._renderDebouncer=new n.RenderDebouncer(((e,t)=>this._renderRows(e,t)),l),this.register(this._renderDebouncer),this.register(l.onDprChange((()=>this.handleDevicePixelRatioChange()))),this.register(o.onResize((()=>this._fullRefresh()))),this.register(o.buffers.onBufferActivate((()=>this._renderer.value?.clear()))),this.register(i.onOptionChange((()=>this._handleOptionsChanged()))),this.register(this._charSizeService.onCharSizeChange((()=>this.handleCharSizeChanged()))),this.register(r.onDecorationRegistered((()=>this._fullRefresh()))),this.register(r.onDecorationRemoved((()=>this._fullRefresh()))),this.register(i.onMultipleOptionChange(["customGlyphs","drawBoldTextInBrightColors","letterSpacing","lineHeight","fontFamily","fontSize","fontWeight","fontWeightBold","minimumContrastRatio","rescaleOverlappingGlyphs"],(()=>{this.clear(),this.handleResize(o.cols,o.rows),this._fullRefresh()}))),this.register(i.onMultipleOptionChange(["cursorBlink","cursorStyle"],(()=>this.refreshRows(o.buffer.y,o.buffer.y,!0)))),this.register(d.onChangeColors((()=>this._fullRefresh()))),this._registerIntersectionObserver(l.window,t),this.register(l.onWindowChange((e=>this._registerIntersectionObserver(e,t))))}_registerIntersectionObserver(e,t){if("IntersectionObserver"in e){const i=new e.IntersectionObserver((e=>this._handleIntersectionChange(e[e.length-1])),{threshold:0});i.observe(t),this._observerDisposable.value=(0,h.toDisposable)((()=>i.disconnect()))}}_handleIntersectionChange(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this._pausedResizeTask.flush(),this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)}refreshRows(e,t,i=!1){this._isPaused?this._needsFullRefresh=!0:(i||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))}_renderRows(e,t){this._renderer.value&&(e=Math.min(e,this._rowCount-1),t=Math.min(t,this._rowCount-1),this._renderer.value.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.value.handleSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRenderedViewportChange.fire({start:e,end:t}),this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0)}resize(e,t){this._rowCount=t,this._fireOnCanvasResize()}_handleOptionsChanged(){this._renderer.value&&(this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize())}_fireOnCanvasResize(){this._renderer.value&&(this._renderer.value.dimensions.css.canvas.width===this._canvasWidth&&this._renderer.value.dimensions.css.canvas.height===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.value.dimensions))}hasRenderer(){return!!this._renderer.value}setRenderer(e){this._renderer.value=e,this._renderer.value&&(this._renderer.value.onRequestRedraw((e=>this.refreshRows(e.start,e.end,!0))),this._needsSelectionRefresh=!0,this._fullRefresh())}addRefreshCallback(e){return this._renderDebouncer.addRefreshCallback(e)}_fullRefresh(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)}clearTextureAtlas(){this._renderer.value&&(this._renderer.value.clearTextureAtlas?.(),this._fullRefresh())}handleDevicePixelRatioChange(){this._charSizeService.measure(),this._renderer.value&&(this._renderer.value.handleDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1))}handleResize(e,t){this._renderer.value&&(this._isPaused?this._pausedResizeTask.set((()=>this._renderer.value?.handleResize(e,t))):this._renderer.value.handleResize(e,t),this._fullRefresh())}handleCharSizeChanged(){this._renderer.value?.handleCharSizeChanged()}handleBlur(){this._renderer.value?.handleBlur()}handleFocus(){this._renderer.value?.handleFocus()}handleSelectionChanged(e,t,i){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=i,this._renderer.value?.handleSelectionChanged(e,t,i)}handleCursorMove(){this._renderer.value?.handleCursorMove()}clear(){this._renderer.value?.clear()}};t.RenderService=d=s([r(2,l.IOptionsService),r(3,o.ICharSizeService),r(4,l.IDecorationService),r(5,l.IBufferService),r(6,o.ICoreBrowserService),r(7,o.IThemeService)],d)},9312:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionService=void 0;const n=i(9806),o=i(9504),a=i(456),h=i(4725),c=i(8460),l=i(844),d=i(6114),_=i(4841),u=i(511),f=i(2585),v=String.fromCharCode(160),p=new RegExp(v,"g");let g=t.SelectionService=class extends l.Disposable{constructor(e,t,i,s,r,n,o,h,d){super(),this._element=e,this._screenElement=t,this._linkifier=i,this._bufferService=s,this._coreService=r,this._mouseService=n,this._optionsService=o,this._renderService=h,this._coreBrowserService=d,this._dragScrollAmount=0,this._enabled=!0,this._workCell=new u.CellData,this._mouseDownTimeStamp=0,this._oldHasSelection=!1,this._oldSelectionStart=void 0,this._oldSelectionEnd=void 0,this._onLinuxMouseSelection=this.register(new c.EventEmitter),this.onLinuxMouseSelection=this._onLinuxMouseSelection.event,this._onRedrawRequest=this.register(new c.EventEmitter),this.onRequestRedraw=this._onRedrawRequest.event,this._onSelectionChange=this.register(new c.EventEmitter),this.onSelectionChange=this._onSelectionChange.event,this._onRequestScrollLines=this.register(new c.EventEmitter),this.onRequestScrollLines=this._onRequestScrollLines.event,this._mouseMoveListener=e=>this._handleMouseMove(e),this._mouseUpListener=e=>this._handleMouseUp(e),this._coreService.onUserInput((()=>{this.hasSelection&&this.clearSelection()})),this._trimListener=this._bufferService.buffer.lines.onTrim((e=>this._handleTrim(e))),this.register(this._bufferService.buffers.onBufferActivate((e=>this._handleBufferActivate(e)))),this.enable(),this._model=new a.SelectionModel(this._bufferService),this._activeSelectionMode=0,this.register((0,l.toDisposable)((()=>{this._removeMouseDownListeners()})))}reset(){this.clearSelection()}disable(){this.clearSelection(),this._enabled=!1}enable(){this._enabled=!0}get selectionStart(){return this._model.finalSelectionStart}get selectionEnd(){return this._model.finalSelectionEnd}get hasSelection(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])}get selectionText(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return"";const i=this._bufferService.buffer,s=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return"";const r=e[0]<t[0]?e[0]:t[0],n=e[0]<t[0]?t[0]:e[0];for(let o=e[1];o<=t[1];o++){const e=i.translateBufferLineToString(o,!0,r,n);s.push(e)}}else{const r=e[1]===t[1]?t[0]:void 0;s.push(i.translateBufferLineToString(e[1],!0,e[0],r));for(let r=e[1]+1;r<=t[1]-1;r++){const e=i.lines.get(r),t=i.translateBufferLineToString(r,!0);e?.isWrapped?s[s.length-1]+=t:s.push(t)}if(e[1]!==t[1]){const e=i.lines.get(t[1]),r=i.translateBufferLineToString(t[1],!0,0,t[0]);e&&e.isWrapped?s[s.length-1]+=r:s.push(r)}}return s.map((e=>e.replace(p," "))).join(d.isWindows?"\r\n":"\n")}clearSelection(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()}refresh(e){this._refreshAnimationFrame||(this._refreshAnimationFrame=this._coreBrowserService.window.requestAnimationFrame((()=>this._refresh()))),d.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)}_refresh(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})}_isClickInSelection(e){const t=this._getMouseBufferCoords(e),i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!!(i&&s&&t)&&this._areCoordsInSelection(t,i,s)}isCellInSelection(e,t){const i=this._model.finalSelectionStart,s=this._model.finalSelectionEnd;return!(!i||!s)&&this._areCoordsInSelection([e,t],i,s)}_areCoordsInSelection(e,t,i){return e[1]>t[1]&&e[1]<i[1]||t[1]===i[1]&&e[1]===t[1]&&e[0]>=t[0]&&e[0]<i[0]||t[1]<i[1]&&e[1]===i[1]&&e[0]<i[0]||t[1]<i[1]&&e[1]===t[1]&&e[0]>=t[0]}_selectWordAtCursor(e,t){const i=this._linkifier.currentLink?.link?.range;if(i)return this._model.selectionStart=[i.start.x-1,i.start.y-1],this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols),this._model.selectionEnd=void 0,!0;const s=this._getMouseBufferCoords(e);return!!s&&(this._selectWordAt(s,t),this._model.selectionEnd=void 0,!0)}selectAll(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()}selectLines(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()}_handleTrim(e){this._model.handleTrim(e)&&this.refresh()}_getMouseBufferCoords(e){const t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t}_getMouseEventScrollAmount(e){let t=(0,n.getCoordsRelativeToElement)(this._coreBrowserService.window,e,this._screenElement)[1];const i=this._renderService.dimensions.css.canvas.height;return t>=0&&t<=i?0:(t>i&&(t-=i),t=Math.min(Math.max(t,-50),50),t/=50,t/Math.abs(t)+Math.round(14*t))}shouldForceSelection(e){return d.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey}handleMouseDown(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._handleIncrementalClick(e):1===e.detail?this._handleSingleClick(e):2===e.detail?this._handleDoubleClick(e):3===e.detail&&this._handleTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}}_addMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener("mouseup",this._mouseUpListener)),this._dragScrollIntervalTimer=this._coreBrowserService.window.setInterval((()=>this._dragScroll()),50)}_removeMouseDownListeners(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener("mousemove",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener("mouseup",this._mouseUpListener)),this._coreBrowserService.window.clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0}_handleIncrementalClick(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))}_handleSingleClick(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),!this._model.selectionStart)return;this._model.selectionEnd=void 0;const t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}_handleDoubleClick(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)}_handleTripleClick(e){const t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))}shouldColumnSelect(e){return e.altKey&&!(d.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)}_handleMouseMove(e){if(e.stopImmediatePropagation(),!this._model.selectionStart)return;const t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),!this._model.selectionEnd)return void this.refresh(!0);2===this._activeSelectionMode?this._model.selectionEnd[1]<this._model.selectionStart[1]?this._model.selectionEnd[0]=0:this._model.selectionEnd[0]=this._bufferService.cols:1===this._activeSelectionMode&&this._selectToWordAt(this._model.selectionEnd),this._dragScrollAmount=this._getMouseEventScrollAmount(e),3!==this._activeSelectionMode&&(this._dragScrollAmount>0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));const i=this._bufferService.buffer;if(this._model.selectionEnd[1]<i.lines.length){const e=i.lines.get(this._model.selectionEnd[1]);e&&0===e.hasWidth(this._model.selectionEnd[0])&&this._model.selectionEnd[0]<this._bufferService.cols&&this._model.selectionEnd[0]++}t&&t[0]===this._model.selectionEnd[0]&&t[1]===this._model.selectionEnd[1]||this.refresh(!0)}_dragScroll(){if(this._model.selectionEnd&&this._model.selectionStart&&this._dragScrollAmount){this._onRequestScrollLines.fire({amount:this._dragScrollAmount,suppressScrollEvent:!1});const e=this._bufferService.buffer;this._dragScrollAmount>0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}}_handleMouseUp(e){const t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.rawOptions.altClickMovesCursor){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){const t=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(t&&void 0!==t[0]&&void 0!==t[1]){const e=(0,o.moveToCellSequence)(t[0]-1,t[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(e,!0)}}}else this._fireEventIfSelectionChanged()}_fireEventIfSelectionChanged(){const e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,i=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);i?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,i)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,i)}_fireOnSelectionChange(e,t,i){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=i,this._onSelectionChange.fire()}_handleBufferActivate(e){this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((e=>this._handleTrim(e)))}_convertViewportColToCharacterIndex(e,t){let i=t;for(let s=0;t>=s;s++){const r=e.loadCell(s,this._workCell).getChars().length;0===this._workCell.getWidth()?i--:r>1&&t!==s&&(i+=r-1)}return i}setSelection(e,t,i){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=i,this.refresh(),this._fireEventIfSelectionChanged()}rightClickSelect(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())}_getWordAt(e,t,i=!0,s=!0){if(e[0]>=this._bufferService.cols)return;const r=this._bufferService.buffer,n=r.lines.get(e[1]);if(!n)return;const o=r.translateBufferLineToString(e[1],!1);let a=this._convertViewportColToCharacterIndex(n,e[0]),h=a;const c=e[0]-a;let l=0,d=0,_=0,u=0;if(" "===o.charAt(a)){for(;a>0&&" "===o.charAt(a-1);)a--;for(;h<o.length&&" "===o.charAt(h+1);)h++}else{let t=e[0],i=e[0];0===n.getWidth(t)&&(l++,t--),2===n.getWidth(i)&&(d++,i++);const s=n.getString(i).length;for(s>1&&(u+=s-1,h+=s-1);t>0&&a>0&&!this._isCharWordSeparator(n.loadCell(t-1,this._workCell));){n.loadCell(t-1,this._workCell);const e=this._workCell.getChars().length;0===this._workCell.getWidth()?(l++,t--):e>1&&(_+=e-1,a-=e-1),a--,t--}for(;i<n.length&&h+1<o.length&&!this._isCharWordSeparator(n.loadCell(i+1,this._workCell));){n.loadCell(i+1,this._workCell);const e=this._workCell.getChars().length;2===this._workCell.getWidth()?(d++,i++):e>1&&(u+=e-1,h+=e-1),h++,i++}}h++;let f=a+c-l+_,v=Math.min(this._bufferService.cols,h-a+l+d-_-u);if(t||""!==o.slice(a,h).trim()){if(i&&0===f&&32!==n.getCodePoint(0)){const t=r.lines.get(e[1]-1);if(t&&n.isWrapped&&32!==t.getCodePoint(this._bufferService.cols-1)){const t=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(t){const e=this._bufferService.cols-t.start;f-=e,v+=e}}}if(s&&f+v===this._bufferService.cols&&32!==n.getCodePoint(this._bufferService.cols-1)){const t=r.lines.get(e[1]+1);if(t?.isWrapped&&32!==t.getCodePoint(0)){const t=this._getWordAt([0,e[1]+1],!1,!1,!0);t&&(v+=t.length)}}return{start:f,length:v}}}_selectWordAt(e,t){const i=this._getWordAt(e,t);if(i){for(;i.start<0;)i.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[i.start,e[1]],this._model.selectionStartLength=i.length}}_selectToWordAt(e){const t=this._getWordAt(e,!0);if(t){let i=e[1];for(;t.start<0;)t.start+=this._bufferService.cols,i--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,i++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,i]}}_isCharWordSeparator(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0}_selectLineAt(e){const t=this._bufferService.buffer.getWrappedRangeForLine(e),i={start:{x:0,y:t.first},end:{x:this._bufferService.cols-1,y:t.last}};this._model.selectionStart=[0,t.first],this._model.selectionEnd=void 0,this._model.selectionStartLength=(0,_.getRangeLength)(i,this._bufferService.cols)}};t.SelectionService=g=s([r(3,f.IBufferService),r(4,f.ICoreService),r(5,h.IMouseService),r(6,f.IOptionsService),r(7,h.IRenderService),r(8,h.ICoreBrowserService)],g)},4725:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ILinkProviderService=t.IThemeService=t.ICharacterJoinerService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;const s=i(8343);t.ICharSizeService=(0,s.createDecorator)("CharSizeService"),t.ICoreBrowserService=(0,s.createDecorator)("CoreBrowserService"),t.IMouseService=(0,s.createDecorator)("MouseService"),t.IRenderService=(0,s.createDecorator)("RenderService"),t.ISelectionService=(0,s.createDecorator)("SelectionService"),t.ICharacterJoinerService=(0,s.createDecorator)("CharacterJoinerService"),t.IThemeService=(0,s.createDecorator)("ThemeService"),t.ILinkProviderService=(0,s.createDecorator)("LinkProviderService")},6731:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.ThemeService=t.DEFAULT_ANSI_COLORS=void 0;const n=i(7239),o=i(8055),a=i(8460),h=i(844),c=i(2585),l=o.css.toColor("#ffffff"),d=o.css.toColor("#000000"),_=o.css.toColor("#ffffff"),u=o.css.toColor("#000000"),f={css:"rgba(255, 255, 255, 0.3)",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze((()=>{const e=[o.css.toColor("#2e3436"),o.css.toColor("#cc0000"),o.css.toColor("#4e9a06"),o.css.toColor("#c4a000"),o.css.toColor("#3465a4"),o.css.toColor("#75507b"),o.css.toColor("#06989a"),o.css.toColor("#d3d7cf"),o.css.toColor("#555753"),o.css.toColor("#ef2929"),o.css.toColor("#8ae234"),o.css.toColor("#fce94f"),o.css.toColor("#729fcf"),o.css.toColor("#ad7fa8"),o.css.toColor("#34e2e2"),o.css.toColor("#eeeeec")],t=[0,95,135,175,215,255];for(let i=0;i<216;i++){const s=t[i/36%6|0],r=t[i/6%6|0],n=t[i%6];e.push({css:o.channels.toCss(s,r,n),rgba:o.channels.toRgba(s,r,n)})}for(let t=0;t<24;t++){const i=8+10*t;e.push({css:o.channels.toCss(i,i,i),rgba:o.channels.toRgba(i,i,i)})}return e})());let v=t.ThemeService=class extends h.Disposable{get colors(){return this._colors}constructor(e){super(),this._optionsService=e,this._contrastCache=new n.ColorContrastCache,this._halfContrastCache=new n.ColorContrastCache,this._onChangeColors=this.register(new a.EventEmitter),this.onChangeColors=this._onChangeColors.event,this._colors={foreground:l,background:d,cursor:_,cursorAccent:u,selectionForeground:void 0,selectionBackgroundTransparent:f,selectionBackgroundOpaque:o.color.blend(d,f),selectionInactiveBackgroundTransparent:f,selectionInactiveBackgroundOpaque:o.color.blend(d,f),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache,halfContrastCache:this._halfContrastCache},this._updateRestoreColors(),this._setTheme(this._optionsService.rawOptions.theme),this.register(this._optionsService.onSpecificOptionChange("minimumContrastRatio",(()=>this._contrastCache.clear()))),this.register(this._optionsService.onSpecificOptionChange("theme",(()=>this._setTheme(this._optionsService.rawOptions.theme))))}_setTheme(e={}){const i=this._colors;if(i.foreground=p(e.foreground,l),i.background=p(e.background,d),i.cursor=p(e.cursor,_),i.cursorAccent=p(e.cursorAccent,u),i.selectionBackgroundTransparent=p(e.selectionBackground,f),i.selectionBackgroundOpaque=o.color.blend(i.background,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundTransparent=p(e.selectionInactiveBackground,i.selectionBackgroundTransparent),i.selectionInactiveBackgroundOpaque=o.color.blend(i.background,i.selectionInactiveBackgroundTransparent),i.selectionForeground=e.selectionForeground?p(e.selectionForeground,o.NULL_COLOR):void 0,i.selectionForeground===o.NULL_COLOR&&(i.selectionForeground=void 0),o.color.isOpaque(i.selectionBackgroundTransparent)){const e=.3;i.selectionBackgroundTransparent=o.color.opacity(i.selectionBackgroundTransparent,e)}if(o.color.isOpaque(i.selectionInactiveBackgroundTransparent)){const e=.3;i.selectionInactiveBackgroundTransparent=o.color.opacity(i.selectionInactiveBackgroundTransparent,e)}if(i.ansi=t.DEFAULT_ANSI_COLORS.slice(),i.ansi[0]=p(e.black,t.DEFAULT_ANSI_COLORS[0]),i.ansi[1]=p(e.red,t.DEFAULT_ANSI_COLORS[1]),i.ansi[2]=p(e.green,t.DEFAULT_ANSI_COLORS[2]),i.ansi[3]=p(e.yellow,t.DEFAULT_ANSI_COLORS[3]),i.ansi[4]=p(e.blue,t.DEFAULT_ANSI_COLORS[4]),i.ansi[5]=p(e.magenta,t.DEFAULT_ANSI_COLORS[5]),i.ansi[6]=p(e.cyan,t.DEFAULT_ANSI_COLORS[6]),i.ansi[7]=p(e.white,t.DEFAULT_ANSI_COLORS[7]),i.ansi[8]=p(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),i.ansi[9]=p(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),i.ansi[10]=p(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),i.ansi[11]=p(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),i.ansi[12]=p(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),i.ansi[13]=p(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),i.ansi[14]=p(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),i.ansi[15]=p(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),e.extendedAnsi){const s=Math.min(i.ansi.length-16,e.extendedAnsi.length);for(let r=0;r<s;r++)i.ansi[r+16]=p(e.extendedAnsi[r],t.DEFAULT_ANSI_COLORS[r+16])}this._contrastCache.clear(),this._halfContrastCache.clear(),this._updateRestoreColors(),this._onChangeColors.fire(this.colors)}restoreColor(e){this._restoreColor(e),this._onChangeColors.fire(this.colors)}_restoreColor(e){if(void 0!==e)switch(e){case 256:this._colors.foreground=this._restoreColors.foreground;break;case 257:this._colors.background=this._restoreColors.background;break;case 258:this._colors.cursor=this._restoreColors.cursor;break;default:this._colors.ansi[e]=this._restoreColors.ansi[e]}else for(let e=0;e<this._restoreColors.ansi.length;++e)this._colors.ansi[e]=this._restoreColors.ansi[e]}modifyColors(e){e(this._colors),this._onChangeColors.fire(this.colors)}_updateRestoreColors(){this._restoreColors={foreground:this._colors.foreground,background:this._colors.background,cursor:this._colors.cursor,ansi:this._colors.ansi.slice()}}};function p(e,t){if(void 0!==e)try{return o.css.toColor(e)}catch{}return t}t.ThemeService=v=s([r(0,c.IOptionsService)],v)},6349:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CircularList=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._maxLength=e,this.onDeleteEmitter=this.register(new s.EventEmitter),this.onDelete=this.onDeleteEmitter.event,this.onInsertEmitter=this.register(new s.EventEmitter),this.onInsert=this.onInsertEmitter.event,this.onTrimEmitter=this.register(new s.EventEmitter),this.onTrim=this.onTrimEmitter.event,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}get maxLength(){return this._maxLength}set maxLength(e){if(this._maxLength===e)return;const t=new Array(e);for(let i=0;i<Math.min(e,this.length);i++)t[i]=this._array[this._getCyclicIndex(i)];this._array=t,this._maxLength=e,this._startIndex=0}get length(){return this._length}set length(e){if(e>this._length)for(let t=this._length;t<e;t++)this._array[t]=void 0;this._length=e}get(e){return this._array[this._getCyclicIndex(e)]}set(e,t){this._array[this._getCyclicIndex(e)]=t}push(e){this._array[this._getCyclicIndex(this._length)]=e,this._length===this._maxLength?(this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1)):this._length++}recycle(){if(this._length!==this._maxLength)throw new Error("Can only recycle when the buffer is full");return this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1),this._array[this._getCyclicIndex(this._length-1)]}get isFull(){return this._length===this._maxLength}pop(){return this._array[this._getCyclicIndex(this._length---1)]}splice(e,t,...i){if(t){for(let i=e;i<this._length-t;i++)this._array[this._getCyclicIndex(i)]=this._array[this._getCyclicIndex(i+t)];this._length-=t,this.onDeleteEmitter.fire({index:e,amount:t})}for(let t=this._length-1;t>=e;t--)this._array[this._getCyclicIndex(t+i.length)]=this._array[this._getCyclicIndex(t)];for(let t=0;t<i.length;t++)this._array[this._getCyclicIndex(e+t)]=i[t];if(i.length&&this.onInsertEmitter.fire({index:e,amount:i.length}),this._length+i.length>this._maxLength){const e=this._length+i.length-this._maxLength;this._startIndex+=e,this._length=this._maxLength,this.onTrimEmitter.fire(e)}else this._length+=i.length}trimStart(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)}shiftElements(e,t,i){if(!(t<=0)){if(e<0||e>=this._length)throw new Error("start argument out of range");if(e+i<0)throw new Error("Cannot shift elements in list beyond index 0");if(i>0){for(let s=t-1;s>=0;s--)this.set(e+s+i,this.get(e+s));const s=e+t+i-this._length;if(s>0)for(this._length+=s;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(let s=0;s<t;s++)this.set(e+s+i,this.get(e+s))}}_getCyclicIndex(e){return(this._startIndex+e)%this._maxLength}}t.CircularList=n},1439:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.clone=void 0,t.clone=function e(t,i=5){if("object"!=typeof t)return t;const s=Array.isArray(t)?[]:{};for(const r in t)s[r]=i<=1?t[r]:t[r]&&e(t[r],i-1);return s}},8055:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=t.NULL_COLOR=void 0;let i=0,s=0,r=0,n=0;var o,a,h,c,l;function d(e){const t=e.toString(16);return t.length<2?"0"+t:t}function _(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}t.NULL_COLOR={css:"#00000000",rgba:0},function(e){e.toCss=function(e,t,i,s){return void 0!==s?`#${d(e)}${d(t)}${d(i)}${d(s)}`:`#${d(e)}${d(t)}${d(i)}`},e.toRgba=function(e,t,i,s=255){return(e<<24|t<<16|i<<8|s)>>>0},e.toColor=function(t,i,s,r){return{css:e.toCss(t,i,s,r),rgba:e.toRgba(t,i,s,r)}}}(o||(t.channels=o={})),function(e){function t(e,t){return n=Math.round(255*t),[i,s,r]=l.toChannels(e.rgba),{css:o.toCss(i,s,r,n),rgba:o.toRgba(i,s,r,n)}}e.blend=function(e,t){if(n=(255&t.rgba)/255,1===n)return{css:t.css,rgba:t.rgba};const a=t.rgba>>24&255,h=t.rgba>>16&255,c=t.rgba>>8&255,l=e.rgba>>24&255,d=e.rgba>>16&255,_=e.rgba>>8&255;return i=l+Math.round((a-l)*n),s=d+Math.round((h-d)*n),r=_+Math.round((c-_)*n),{css:o.toCss(i,s,r),rgba:o.toRgba(i,s,r)}},e.isOpaque=function(e){return 255==(255&e.rgba)},e.ensureContrastRatio=function(e,t,i){const s=l.ensureContrastRatio(e.rgba,t.rgba,i);if(s)return o.toColor(s>>24&255,s>>16&255,s>>8&255)},e.opaque=function(e){const t=(255|e.rgba)>>>0;return[i,s,r]=l.toChannels(t),{css:o.toCss(i,s,r),rgba:t}},e.opacity=t,e.multiplyOpacity=function(e,i){return n=255&e.rgba,t(e,n*i/255)},e.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]}}(a||(t.color=a={})),function(e){let t,a;try{const e=document.createElement("canvas");e.width=1,e.height=1;const i=e.getContext("2d",{willReadFrequently:!0});i&&(t=i,t.globalCompositeOperation="copy",a=t.createLinearGradient(0,0,1,1))}catch{}e.toColor=function(e){if(e.match(/#[\da-f]{3,8}/i))switch(e.length){case 4:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),o.toColor(i,s,r);case 5:return i=parseInt(e.slice(1,2).repeat(2),16),s=parseInt(e.slice(2,3).repeat(2),16),r=parseInt(e.slice(3,4).repeat(2),16),n=parseInt(e.slice(4,5).repeat(2),16),o.toColor(i,s,r,n);case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}const h=e.match(/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(,\s*(0|1|\d?\.(\d+))\s*)?\)/);if(h)return i=parseInt(h[1]),s=parseInt(h[2]),r=parseInt(h[3]),n=Math.round(255*(void 0===h[5]?1:parseFloat(h[5]))),o.toColor(i,s,r,n);if(!t||!a)throw new Error("css.toColor: Unsupported css format");if(t.fillStyle=a,t.fillStyle=e,"string"!=typeof t.fillStyle)throw new Error("css.toColor: Unsupported css format");if(t.fillRect(0,0,1,1),[i,s,r,n]=t.getImageData(0,0,1,1).data,255!==n)throw new Error("css.toColor: Unsupported css format");return{rgba:o.toRgba(i,s,r,n),css:e}}}(h||(t.css=h={})),function(e){function t(e,t,i){const s=e/255,r=t/255,n=i/255;return.2126*(s<=.03928?s/12.92:Math.pow((s+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(c||(t.rgb=c={})),function(e){function t(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));for(;l<i&&(o>0||a>0||h>0);)o-=Math.max(0,Math.ceil(.1*o)),a-=Math.max(0,Math.ceil(.1*a)),h-=Math.max(0,Math.ceil(.1*h)),l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}function a(e,t,i){const s=e>>24&255,r=e>>16&255,n=e>>8&255;let o=t>>24&255,a=t>>16&255,h=t>>8&255,l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));for(;l<i&&(o<255||a<255||h<255);)o=Math.min(255,o+Math.ceil(.1*(255-o))),a=Math.min(255,a+Math.ceil(.1*(255-a))),h=Math.min(255,h+Math.ceil(.1*(255-h))),l=_(c.relativeLuminance2(o,a,h),c.relativeLuminance2(s,r,n));return(o<<24|a<<16|h<<8|255)>>>0}e.blend=function(e,t){if(n=(255&t)/255,1===n)return t;const a=t>>24&255,h=t>>16&255,c=t>>8&255,l=e>>24&255,d=e>>16&255,_=e>>8&255;return i=l+Math.round((a-l)*n),s=d+Math.round((h-d)*n),r=_+Math.round((c-_)*n),o.toRgba(i,s,r)},e.ensureContrastRatio=function(e,i,s){const r=c.relativeLuminance(e>>8),n=c.relativeLuminance(i>>8);if(_(r,n)<s){if(n<r){const n=t(e,i,s),o=_(r,c.relativeLuminance(n>>8));if(o<s){const t=a(e,i,s);return o>_(r,c.relativeLuminance(t>>8))?n:t}return n}const o=a(e,i,s),h=_(r,c.relativeLuminance(o>>8));if(h<s){const n=t(e,i,s);return h>_(r,c.relativeLuminance(n>>8))?o:n}return o}},e.reduceLuminance=t,e.increaseLuminance=a,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]}}(l||(t.rgba=l={})),t.toPaddedHex=d,t.contrastRatio=_},8969:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CoreTerminal=void 0;const s=i(844),r=i(2585),n=i(4348),o=i(7866),a=i(744),h=i(7302),c=i(6975),l=i(8460),d=i(1753),_=i(1480),u=i(7994),f=i(9282),v=i(5435),p=i(5981),g=i(2660);let m=!1;class S extends s.Disposable{get onScroll(){return this._onScrollApi||(this._onScrollApi=this.register(new l.EventEmitter),this._onScroll.event((e=>{this._onScrollApi?.fire(e.position)}))),this._onScrollApi.event}get cols(){return this._bufferService.cols}get rows(){return this._bufferService.rows}get buffers(){return this._bufferService.buffers}get options(){return this.optionsService.options}set options(e){for(const t in e)this.optionsService.options[t]=e[t]}constructor(e){super(),this._windowsWrappingHeuristics=this.register(new s.MutableDisposable),this._onBinary=this.register(new l.EventEmitter),this.onBinary=this._onBinary.event,this._onData=this.register(new l.EventEmitter),this.onData=this._onData.event,this._onLineFeed=this.register(new l.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onResize=this.register(new l.EventEmitter),this.onResize=this._onResize.event,this._onWriteParsed=this.register(new l.EventEmitter),this.onWriteParsed=this._onWriteParsed.event,this._onScroll=this.register(new l.EventEmitter),this._instantiationService=new n.InstantiationService,this.optionsService=this.register(new h.OptionsService(e)),this._instantiationService.setService(r.IOptionsService,this.optionsService),this._bufferService=this.register(this._instantiationService.createInstance(a.BufferService)),this._instantiationService.setService(r.IBufferService,this._bufferService),this._logService=this.register(this._instantiationService.createInstance(o.LogService)),this._instantiationService.setService(r.ILogService,this._logService),this.coreService=this.register(this._instantiationService.createInstance(c.CoreService)),this._instantiationService.setService(r.ICoreService,this.coreService),this.coreMouseService=this.register(this._instantiationService.createInstance(d.CoreMouseService)),this._instantiationService.setService(r.ICoreMouseService,this.coreMouseService),this.unicodeService=this.register(this._instantiationService.createInstance(_.UnicodeService)),this._instantiationService.setService(r.IUnicodeService,this.unicodeService),this._charsetService=this._instantiationService.createInstance(u.CharsetService),this._instantiationService.setService(r.ICharsetService,this._charsetService),this._oscLinkService=this._instantiationService.createInstance(g.OscLinkService),this._instantiationService.setService(r.IOscLinkService,this._oscLinkService),this._inputHandler=this.register(new v.InputHandler(this._bufferService,this._charsetService,this.coreService,this._logService,this.optionsService,this._oscLinkService,this.coreMouseService,this.unicodeService)),this.register((0,l.forwardEvent)(this._inputHandler.onLineFeed,this._onLineFeed)),this.register(this._inputHandler),this.register((0,l.forwardEvent)(this._bufferService.onResize,this._onResize)),this.register((0,l.forwardEvent)(this.coreService.onData,this._onData)),this.register((0,l.forwardEvent)(this.coreService.onBinary,this._onBinary)),this.register(this.coreService.onRequestScrollToBottom((()=>this.scrollToBottom()))),this.register(this.coreService.onUserInput((()=>this._writeBuffer.handleUserInput()))),this.register(this.optionsService.onMultipleOptionChange(["windowsMode","windowsPty"],(()=>this._handleWindowsPtyOptionChange()))),this.register(this._bufferService.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this.register(this._inputHandler.onScroll((e=>{this._onScroll.fire({position:this._bufferService.buffer.ydisp,source:0}),this._inputHandler.markRangeDirty(this._bufferService.buffer.scrollTop,this._bufferService.buffer.scrollBottom)}))),this._writeBuffer=this.register(new p.WriteBuffer(((e,t)=>this._inputHandler.parse(e,t)))),this.register((0,l.forwardEvent)(this._writeBuffer.onWriteParsed,this._onWriteParsed))}write(e,t){this._writeBuffer.write(e,t)}writeSync(e,t){this._logService.logLevel<=r.LogLevelEnum.WARN&&!m&&(this._logService.warn("writeSync is unreliable and will be removed soon."),m=!0),this._writeBuffer.writeSync(e,t)}input(e,t=!0){this.coreService.triggerDataEvent(e,t)}resize(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,a.MINIMUM_COLS),t=Math.max(t,a.MINIMUM_ROWS),this._bufferService.resize(e,t))}scroll(e,t=!1){this._bufferService.scroll(e,t)}scrollLines(e,t,i){this._bufferService.scrollLines(e,t,i)}scrollPages(e){this.scrollLines(e*(this.rows-1))}scrollToTop(){this.scrollLines(-this._bufferService.buffer.ydisp)}scrollToBottom(){this.scrollLines(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp)}scrollToLine(e){const t=e-this._bufferService.buffer.ydisp;0!==t&&this.scrollLines(t)}registerEscHandler(e,t){return this._inputHandler.registerEscHandler(e,t)}registerDcsHandler(e,t){return this._inputHandler.registerDcsHandler(e,t)}registerCsiHandler(e,t){return this._inputHandler.registerCsiHandler(e,t)}registerOscHandler(e,t){return this._inputHandler.registerOscHandler(e,t)}_setup(){this._handleWindowsPtyOptionChange()}reset(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()}_handleWindowsPtyOptionChange(){let e=!1;const t=this.optionsService.rawOptions.windowsPty;t&&void 0!==t.buildNumber&&void 0!==t.buildNumber?e=!!("conpty"===t.backend&&t.buildNumber<21376):this.optionsService.rawOptions.windowsMode&&(e=!0),e?this._enableWindowsWrappingHeuristics():this._windowsWrappingHeuristics.clear()}_enableWindowsWrappingHeuristics(){if(!this._windowsWrappingHeuristics.value){const e=[];e.push(this.onLineFeed(f.updateWindowsModeWrappedState.bind(null,this._bufferService))),e.push(this.registerCsiHandler({final:"H"},(()=>((0,f.updateWindowsModeWrappedState)(this._bufferService),!1)))),this._windowsWrappingHeuristics.value=(0,s.toDisposable)((()=>{for(const t of e)t.dispose()}))}}}t.CoreTerminal=S},8460:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let s=0;s<i.length;s++)i[s].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},5435:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;const n=i(2584),o=i(7116),a=i(2015),h=i(844),c=i(482),l=i(8437),d=i(8460),_=i(643),u=i(511),f=i(3734),v=i(2585),p=i(1480),g=i(6242),m=i(6351),S=i(5941),C={"(":0,")":1,"*":2,"+":3,"-":1,".":2},b=131072;function w(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}var y;!function(e){e[e.GET_WIN_SIZE_PIXELS=0]="GET_WIN_SIZE_PIXELS",e[e.GET_CELL_SIZE_PIXELS=1]="GET_CELL_SIZE_PIXELS"}(y||(t.WindowsOptionsReportType=y={}));let E=0;class k extends h.Disposable{getAttrData(){return this._curAttrData}constructor(e,t,i,s,r,h,_,f,v=new a.EscapeSequenceParser){super(),this._bufferService=e,this._charsetService=t,this._coreService=i,this._logService=s,this._optionsService=r,this._oscLinkService=h,this._coreMouseService=_,this._unicodeService=f,this._parser=v,this._parseBuffer=new Uint32Array(4096),this._stringDecoder=new c.StringToUtf32,this._utf8Decoder=new c.Utf8ToUtf32,this._workCell=new u.CellData,this._windowTitle="",this._iconName="",this._windowTitleStack=[],this._iconNameStack=[],this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone(),this._onRequestBell=this.register(new d.EventEmitter),this.onRequestBell=this._onRequestBell.event,this._onRequestRefreshRows=this.register(new d.EventEmitter),this.onRequestRefreshRows=this._onRequestRefreshRows.event,this._onRequestReset=this.register(new d.EventEmitter),this.onRequestReset=this._onRequestReset.event,this._onRequestSendFocus=this.register(new d.EventEmitter),this.onRequestSendFocus=this._onRequestSendFocus.event,this._onRequestSyncScrollBar=this.register(new d.EventEmitter),this.onRequestSyncScrollBar=this._onRequestSyncScrollBar.event,this._onRequestWindowsOptionsReport=this.register(new d.EventEmitter),this.onRequestWindowsOptionsReport=this._onRequestWindowsOptionsReport.event,this._onA11yChar=this.register(new d.EventEmitter),this.onA11yChar=this._onA11yChar.event,this._onA11yTab=this.register(new d.EventEmitter),this.onA11yTab=this._onA11yTab.event,this._onCursorMove=this.register(new d.EventEmitter),this.onCursorMove=this._onCursorMove.event,this._onLineFeed=this.register(new d.EventEmitter),this.onLineFeed=this._onLineFeed.event,this._onScroll=this.register(new d.EventEmitter),this.onScroll=this._onScroll.event,this._onTitleChange=this.register(new d.EventEmitter),this.onTitleChange=this._onTitleChange.event,this._onColor=this.register(new d.EventEmitter),this.onColor=this._onColor.event,this._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},this._specialColors=[256,257,258],this.register(this._parser),this._dirtyRowTracker=new L(this._bufferService),this._activeBuffer=this._bufferService.buffer,this.register(this._bufferService.buffers.onBufferActivate((e=>this._activeBuffer=e.activeBuffer))),this._parser.setCsiHandlerFallback(((e,t)=>{this._logService.debug("Unknown CSI code: ",{identifier:this._parser.identToString(e),params:t.toArray()})})),this._parser.setEscHandlerFallback((e=>{this._logService.debug("Unknown ESC code: ",{identifier:this._parser.identToString(e)})})),this._parser.setExecuteHandlerFallback((e=>{this._logService.debug("Unknown EXECUTE code: ",{code:e})})),this._parser.setOscHandlerFallback(((e,t,i)=>{this._logService.debug("Unknown OSC code: ",{identifier:e,action:t,data:i})})),this._parser.setDcsHandlerFallback(((e,t,i)=>{"HOOK"===t&&(i=i.toArray()),this._logService.debug("Unknown DCS code: ",{identifier:this._parser.identToString(e),action:t,payload:i})})),this._parser.setPrintHandler(((e,t,i)=>this.print(e,t,i))),this._parser.registerCsiHandler({final:"@"},(e=>this.insertChars(e))),this._parser.registerCsiHandler({intermediates:" ",final:"@"},(e=>this.scrollLeft(e))),this._parser.registerCsiHandler({final:"A"},(e=>this.cursorUp(e))),this._parser.registerCsiHandler({intermediates:" ",final:"A"},(e=>this.scrollRight(e))),this._parser.registerCsiHandler({final:"B"},(e=>this.cursorDown(e))),this._parser.registerCsiHandler({final:"C"},(e=>this.cursorForward(e))),this._parser.registerCsiHandler({final:"D"},(e=>this.cursorBackward(e))),this._parser.registerCsiHandler({final:"E"},(e=>this.cursorNextLine(e))),this._parser.registerCsiHandler({final:"F"},(e=>this.cursorPrecedingLine(e))),this._parser.registerCsiHandler({final:"G"},(e=>this.cursorCharAbsolute(e))),this._parser.registerCsiHandler({final:"H"},(e=>this.cursorPosition(e))),this._parser.registerCsiHandler({final:"I"},(e=>this.cursorForwardTab(e))),this._parser.registerCsiHandler({final:"J"},(e=>this.eraseInDisplay(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"J"},(e=>this.eraseInDisplay(e,!0))),this._parser.registerCsiHandler({final:"K"},(e=>this.eraseInLine(e,!1))),this._parser.registerCsiHandler({prefix:"?",final:"K"},(e=>this.eraseInLine(e,!0))),this._parser.registerCsiHandler({final:"L"},(e=>this.insertLines(e))),this._parser.registerCsiHandler({final:"M"},(e=>this.deleteLines(e))),this._parser.registerCsiHandler({final:"P"},(e=>this.deleteChars(e))),this._parser.registerCsiHandler({final:"S"},(e=>this.scrollUp(e))),this._parser.registerCsiHandler({final:"T"},(e=>this.scrollDown(e))),this._parser.registerCsiHandler({final:"X"},(e=>this.eraseChars(e))),this._parser.registerCsiHandler({final:"Z"},(e=>this.cursorBackwardTab(e))),this._parser.registerCsiHandler({final:"`"},(e=>this.charPosAbsolute(e))),this._parser.registerCsiHandler({final:"a"},(e=>this.hPositionRelative(e))),this._parser.registerCsiHandler({final:"b"},(e=>this.repeatPrecedingCharacter(e))),this._parser.registerCsiHandler({final:"c"},(e=>this.sendDeviceAttributesPrimary(e))),this._parser.registerCsiHandler({prefix:">",final:"c"},(e=>this.sendDeviceAttributesSecondary(e))),this._parser.registerCsiHandler({final:"d"},(e=>this.linePosAbsolute(e))),this._parser.registerCsiHandler({final:"e"},(e=>this.vPositionRelative(e))),this._parser.registerCsiHandler({final:"f"},(e=>this.hVPosition(e))),this._parser.registerCsiHandler({final:"g"},(e=>this.tabClear(e))),this._parser.registerCsiHandler({final:"h"},(e=>this.setMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"h"},(e=>this.setModePrivate(e))),this._parser.registerCsiHandler({final:"l"},(e=>this.resetMode(e))),this._parser.registerCsiHandler({prefix:"?",final:"l"},(e=>this.resetModePrivate(e))),this._parser.registerCsiHandler({final:"m"},(e=>this.charAttributes(e))),this._parser.registerCsiHandler({final:"n"},(e=>this.deviceStatus(e))),this._parser.registerCsiHandler({prefix:"?",final:"n"},(e=>this.deviceStatusPrivate(e))),this._parser.registerCsiHandler({intermediates:"!",final:"p"},(e=>this.softReset(e))),this._parser.registerCsiHandler({intermediates:" ",final:"q"},(e=>this.setCursorStyle(e))),this._parser.registerCsiHandler({final:"r"},(e=>this.setScrollRegion(e))),this._parser.registerCsiHandler({final:"s"},(e=>this.saveCursor(e))),this._parser.registerCsiHandler({final:"t"},(e=>this.windowOptions(e))),this._parser.registerCsiHandler({final:"u"},(e=>this.restoreCursor(e))),this._parser.registerCsiHandler({intermediates:"'",final:"}"},(e=>this.insertColumns(e))),this._parser.registerCsiHandler({intermediates:"'",final:"~"},(e=>this.deleteColumns(e))),this._parser.registerCsiHandler({intermediates:'"',final:"q"},(e=>this.selectProtected(e))),this._parser.registerCsiHandler({intermediates:"$",final:"p"},(e=>this.requestMode(e,!0))),this._parser.registerCsiHandler({prefix:"?",intermediates:"$",final:"p"},(e=>this.requestMode(e,!1))),this._parser.setExecuteHandler(n.C0.BEL,(()=>this.bell())),this._parser.setExecuteHandler(n.C0.LF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.VT,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.FF,(()=>this.lineFeed())),this._parser.setExecuteHandler(n.C0.CR,(()=>this.carriageReturn())),this._parser.setExecuteHandler(n.C0.BS,(()=>this.backspace())),this._parser.setExecuteHandler(n.C0.HT,(()=>this.tab())),this._parser.setExecuteHandler(n.C0.SO,(()=>this.shiftOut())),this._parser.setExecuteHandler(n.C0.SI,(()=>this.shiftIn())),this._parser.setExecuteHandler(n.C1.IND,(()=>this.index())),this._parser.setExecuteHandler(n.C1.NEL,(()=>this.nextLine())),this._parser.setExecuteHandler(n.C1.HTS,(()=>this.tabSet())),this._parser.registerOscHandler(0,new g.OscHandler((e=>(this.setTitle(e),this.setIconName(e),!0)))),this._parser.registerOscHandler(1,new g.OscHandler((e=>this.setIconName(e)))),this._parser.registerOscHandler(2,new g.OscHandler((e=>this.setTitle(e)))),this._parser.registerOscHandler(4,new g.OscHandler((e=>this.setOrReportIndexedColor(e)))),this._parser.registerOscHandler(8,new g.OscHandler((e=>this.setHyperlink(e)))),this._parser.registerOscHandler(10,new g.OscHandler((e=>this.setOrReportFgColor(e)))),this._parser.registerOscHandler(11,new g.OscHandler((e=>this.setOrReportBgColor(e)))),this._parser.registerOscHandler(12,new g.OscHandler((e=>this.setOrReportCursorColor(e)))),this._parser.registerOscHandler(104,new g.OscHandler((e=>this.restoreIndexedColor(e)))),this._parser.registerOscHandler(110,new g.OscHandler((e=>this.restoreFgColor(e)))),this._parser.registerOscHandler(111,new g.OscHandler((e=>this.restoreBgColor(e)))),this._parser.registerOscHandler(112,new g.OscHandler((e=>this.restoreCursorColor(e)))),this._parser.registerEscHandler({final:"7"},(()=>this.saveCursor())),this._parser.registerEscHandler({final:"8"},(()=>this.restoreCursor())),this._parser.registerEscHandler({final:"D"},(()=>this.index())),this._parser.registerEscHandler({final:"E"},(()=>this.nextLine())),this._parser.registerEscHandler({final:"H"},(()=>this.tabSet())),this._parser.registerEscHandler({final:"M"},(()=>this.reverseIndex())),this._parser.registerEscHandler({final:"="},(()=>this.keypadApplicationMode())),this._parser.registerEscHandler({final:">"},(()=>this.keypadNumericMode())),this._parser.registerEscHandler({final:"c"},(()=>this.fullReset())),this._parser.registerEscHandler({final:"n"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"o"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"|"},(()=>this.setgLevel(3))),this._parser.registerEscHandler({final:"}"},(()=>this.setgLevel(2))),this._parser.registerEscHandler({final:"~"},(()=>this.setgLevel(1))),this._parser.registerEscHandler({intermediates:"%",final:"@"},(()=>this.selectDefaultCharset())),this._parser.registerEscHandler({intermediates:"%",final:"G"},(()=>this.selectDefaultCharset()));for(const e in o.CHARSETS)this._parser.registerEscHandler({intermediates:"(",final:e},(()=>this.selectCharset("("+e))),this._parser.registerEscHandler({intermediates:")",final:e},(()=>this.selectCharset(")"+e))),this._parser.registerEscHandler({intermediates:"*",final:e},(()=>this.selectCharset("*"+e))),this._parser.registerEscHandler({intermediates:"+",final:e},(()=>this.selectCharset("+"+e))),this._parser.registerEscHandler({intermediates:"-",final:e},(()=>this.selectCharset("-"+e))),this._parser.registerEscHandler({intermediates:".",final:e},(()=>this.selectCharset("."+e))),this._parser.registerEscHandler({intermediates:"/",final:e},(()=>this.selectCharset("/"+e)));this._parser.registerEscHandler({intermediates:"#",final:"8"},(()=>this.screenAlignmentPattern())),this._parser.setErrorHandler((e=>(this._logService.error("Parsing error: ",e),e))),this._parser.registerDcsHandler({intermediates:"$",final:"q"},new m.DcsHandler(((e,t)=>this.requestStatusString(e,t))))}_preserveStack(e,t,i,s){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=i,this._parseStack.position=s}_logSlowResolvingAsync(e){this._logService.logLevel<=v.LogLevelEnum.WARN&&Promise.race([e,new Promise(((e,t)=>setTimeout((()=>t("#SLOW_TIMEOUT")),5e3)))]).catch((e=>{if("#SLOW_TIMEOUT"!==e)throw e;console.warn("async parser handler taking longer than 5000 ms")}))}_getCurrentLinkId(){return this._curAttrData.extended.urlId}parse(e,t){let i,s=this._activeBuffer.x,r=this._activeBuffer.y,n=0;const o=this._parseStack.paused;if(o){if(i=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(i),i;s=this._parseStack.cursorStartX,r=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>b&&(n=this._parseStack.position+b)}if(this._logService.logLevel<=v.LogLevelEnum.DEBUG&&this._logService.debug("parsing data"+("string"==typeof e?` "${e}"`:` "${Array.prototype.map.call(e,(e=>String.fromCharCode(e))).join("")}"`),"string"==typeof e?e.split("").map((e=>e.charCodeAt(0))):e),this._parseBuffer.length<e.length&&this._parseBuffer.length<b&&(this._parseBuffer=new Uint32Array(Math.min(e.length,b))),o||this._dirtyRowTracker.clearRange(),e.length>b)for(let t=n;t<e.length;t+=b){const n=t+b<e.length?t+b:e.length,o="string"==typeof e?this._stringDecoder.decode(e.substring(t,n),this._parseBuffer):this._utf8Decoder.decode(e.subarray(t,n),this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,o))return this._preserveStack(s,r,o,t),this._logSlowResolvingAsync(i),i}else if(!o){const t="string"==typeof e?this._stringDecoder.decode(e,this._parseBuffer):this._utf8Decoder.decode(e,this._parseBuffer);if(i=this._parser.parse(this._parseBuffer,t))return this._preserveStack(s,r,t,0),this._logSlowResolvingAsync(i),i}this._activeBuffer.x===s&&this._activeBuffer.y===r||this._onCursorMove.fire();const a=this._dirtyRowTracker.end+(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp),h=this._dirtyRowTracker.start+(this._bufferService.buffer.ybase-this._bufferService.buffer.ydisp);h<this._bufferService.rows&&this._onRequestRefreshRows.fire(Math.min(h,this._bufferService.rows-1),Math.min(a,this._bufferService.rows-1))}print(e,t,i){let s,r;const n=this._charsetService.charset,o=this._optionsService.rawOptions.screenReaderMode,a=this._bufferService.cols,h=this._coreService.decPrivateModes.wraparound,d=this._coreService.modes.insertMode,u=this._curAttrData;let f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._activeBuffer.x&&i-t>0&&2===f.getWidth(this._activeBuffer.x-1)&&f.setCellFromCodepoint(this._activeBuffer.x-1,0,1,u);let v=this._parser.precedingJoinState;for(let g=t;g<i;++g){if(s=e[g],s<127&&n){const e=n[String.fromCharCode(s)];e&&(s=e.charCodeAt(0))}const t=this._unicodeService.charProperties(s,v);r=p.UnicodeService.extractWidth(t);const i=p.UnicodeService.extractShouldJoin(t),m=i?p.UnicodeService.extractWidth(v):0;if(v=t,o&&this._onA11yChar.fire((0,c.stringFromCodePoint)(s)),this._getCurrentLinkId()&&this._oscLinkService.addLineToLink(this._getCurrentLinkId(),this._activeBuffer.ybase+this._activeBuffer.y),this._activeBuffer.x+r-m>a)if(h){const e=f;let t=this._activeBuffer.x-m;for(this._activeBuffer.x=m,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y),m>0&&f instanceof l.BufferLine&&f.copyCellsFrom(e,t,0,m,!1);t<a;)e.setCellFromCodepoint(t++,0,1,u)}else if(this._activeBuffer.x=a-1,2===r)continue;if(i&&this._activeBuffer.x){const e=f.getWidth(this._activeBuffer.x-1)?1:2;f.addCodepointToCell(this._activeBuffer.x-e,s,r);for(let e=r-m;--e>=0;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}else if(d&&(f.insertCells(this._activeBuffer.x,r-m,this._activeBuffer.getNullCell(u)),2===f.getWidth(a-1)&&f.setCellFromCodepoint(a-1,_.NULL_CELL_CODE,_.NULL_CELL_WIDTH,u)),f.setCellFromCodepoint(this._activeBuffer.x++,s,r,u),r>0)for(;--r;)f.setCellFromCodepoint(this._activeBuffer.x++,0,0,u)}this._parser.precedingJoinState=v,this._activeBuffer.x<a&&i-t>0&&0===f.getWidth(this._activeBuffer.x)&&!f.hasContent(this._activeBuffer.x)&&f.setCellFromCodepoint(this._activeBuffer.x,0,1,u),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}registerCsiHandler(e,t){return"t"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(e=>!w(e.params[0],this._optionsService.rawOptions.windowOptions)||t(e)))}registerDcsHandler(e,t){return this._parser.registerDcsHandler(e,new m.DcsHandler(t))}registerEscHandler(e,t){return this._parser.registerEscHandler(e,t)}registerOscHandler(e,t){return this._parser.registerOscHandler(e,new g.OscHandler(t))}bell(){return this._onRequestBell.fire(),!0}lineFeed(){return this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows?this._activeBuffer.y=this._bufferService.rows-1:this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0}carriageReturn(){return this._activeBuffer.x=0,!0}backspace(){if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)?.isWrapped){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;const e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);e.hasWidth(this._activeBuffer.x)&&!e.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0}tab(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;const e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0}shiftOut(){return this._charsetService.setgLevel(1),!0}shiftIn(){return this._charsetService.setgLevel(0),!0}_restrictCursor(e=this._bufferService.cols-1){this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_setCursor(e,t){this._dirtyRowTracker.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowTracker.markDirty(this._activeBuffer.y)}_moveCursor(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)}cursorUp(e){const t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0}cursorDown(e){const t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0}cursorForward(e){return this._moveCursor(e.params[0]||1,0),!0}cursorBackward(e){return this._moveCursor(-(e.params[0]||1),0),!0}cursorNextLine(e){return this.cursorDown(e),this._activeBuffer.x=0,!0}cursorPrecedingLine(e){return this.cursorUp(e),this._activeBuffer.x=0,!0}cursorCharAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}cursorPosition(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0}charPosAbsolute(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0}hPositionRelative(e){return this._moveCursor(e.params[0]||1,0),!0}linePosAbsolute(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0}vPositionRelative(e){return this._moveCursor(0,e.params[0]||1),!0}hVPosition(e){return this.cursorPosition(e),!0}tabClear(e){const t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0}cursorForwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0}cursorBackwardTab(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;let t=e.params[0]||1;for(;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0}selectProtected(e){const t=e.params[0];return 1===t&&(this._curAttrData.bg|=536870912),2!==t&&0!==t||(this._curAttrData.bg&=-536870913),!0}_eraseInBufferLine(e,t,i,s=!1,r=!1){const n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,i,this._activeBuffer.getNullCell(this._eraseAttrData()),r),s&&(n.isWrapped=!1)}_resetBufferLine(e,t=!1){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i&&(i.fill(this._activeBuffer.getNullCell(this._eraseAttrData()),t),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),i.isWrapped=!1)}eraseInDisplay(e,t=!1){let i;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);i<this._bufferService.rows;i++)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(i);break;case 1:for(i=this._activeBuffer.y,this._dirtyRowTracker.markDirty(i),this._eraseInBufferLine(i,0,this._activeBuffer.x+1,!0,t),this._activeBuffer.x+1>=this._bufferService.cols&&(this._activeBuffer.lines.get(i+1).isWrapped=!1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 2:for(i=this._bufferService.rows,this._dirtyRowTracker.markDirty(i-1);i--;)this._resetBufferLine(i,t);this._dirtyRowTracker.markDirty(0);break;case 3:const e=this._activeBuffer.lines.length-this._bufferService.rows;e>0&&(this._activeBuffer.lines.trimStart(e),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-e,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-e,0),this._onScroll.fire(0))}return!0}eraseInLine(e,t=!1){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x,t);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1,t);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0,t)}return this._dirtyRowTracker.markDirty(this._activeBuffer.y),!0}insertLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y,s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,r=this._bufferService.rows-1+this._activeBuffer.ybase-s+1;for(;t--;)this._activeBuffer.lines.splice(r-1,1),this._activeBuffer.lines.splice(i,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}deleteLines(e){this._restrictCursor();let t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const i=this._activeBuffer.ybase+this._activeBuffer.y;let s;for(s=this._bufferService.rows-1-this._activeBuffer.scrollBottom,s=this._bufferService.rows-1+this._activeBuffer.ybase-s;t--;)this._activeBuffer.lines.splice(i,1),this._activeBuffer.lines.splice(s,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0}insertChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.insertCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData())),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}deleteChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.deleteCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData())),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}scrollUp(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollDown(e){let t=e.params[0]||1;for(;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,0,this._activeBuffer.getBlankLine(l.DEFAULT_ATTR_DATA));return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollLeft(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}scrollRight(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}insertColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.insertCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}deleteColumns(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;const t=e.params[0]||1;for(let e=this._activeBuffer.scrollTop;e<=this._activeBuffer.scrollBottom;++e){const i=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);i.deleteCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData())),i.isWrapped=!1}return this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0}eraseChars(e){this._restrictCursor();const t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.replaceCells(this._activeBuffer.x,this._activeBuffer.x+(e.params[0]||1),this._activeBuffer.getNullCell(this._eraseAttrData())),this._dirtyRowTracker.markDirty(this._activeBuffer.y)),!0}repeatPrecedingCharacter(e){const t=this._parser.precedingJoinState;if(!t)return!0;const i=e.params[0]||1,s=p.UnicodeService.extractWidth(t),r=this._activeBuffer.x-s,n=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).getString(r),o=new Uint32Array(n.length*i);let a=0;for(let e=0;e<n.length;){const t=n.codePointAt(e)||0;o[a++]=t,e+=t>65535?2:1}let h=a;for(let e=1;e<i;++e)o.copyWithin(h,0,a),h+=a;return this.print(o,0,h),!0}sendDeviceAttributesPrimary(e){return e.params[0]>0||(this._is("xterm")||this._is("rxvt-unicode")||this._is("screen")?this._coreService.triggerDataEvent(n.C0.ESC+"[?1;2c"):this._is("linux")&&this._coreService.triggerDataEvent(n.C0.ESC+"[?6c")),!0}sendDeviceAttributesSecondary(e){return e.params[0]>0||(this._is("xterm")?this._coreService.triggerDataEvent(n.C0.ESC+"[>0;276;0c"):this._is("rxvt-unicode")?this._coreService.triggerDataEvent(n.C0.ESC+"[>85;95;0c"):this._is("linux")?this._coreService.triggerDataEvent(e.params[0]+"c"):this._is("screen")&&this._coreService.triggerDataEvent(n.C0.ESC+"[>83;40003;0c")),!0}_is(e){return 0===(this._optionsService.rawOptions.termName+"").indexOf(e)}setMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!0;break;case 20:this._optionsService.options.convertEol=!0}return!0}setModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!0;break;case 2:this._charsetService.setgCharset(0,o.DEFAULT_CHARSET),this._charsetService.setgCharset(1,o.DEFAULT_CHARSET),this._charsetService.setgCharset(2,o.DEFAULT_CHARSET),this._charsetService.setgCharset(3,o.DEFAULT_CHARSET);break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(132,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!0,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!0;break;case 12:this._optionsService.options.cursorBlink=!0;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!0;break;case 66:this._logService.debug("Serial port requested application keypad."),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire();break;case 9:this._coreMouseService.activeProtocol="X10";break;case 1e3:this._coreMouseService.activeProtocol="VT200";break;case 1002:this._coreMouseService.activeProtocol="DRAG";break;case 1003:this._coreMouseService.activeProtocol="ANY";break;case 1004:this._coreService.decPrivateModes.sendFocus=!0,this._onRequestSendFocus.fire();break;case 1005:this._logService.debug("DECSET 1005 not supported (see #2507)");break;case 1006:this._coreMouseService.activeEncoding="SGR";break;case 1015:this._logService.debug("DECSET 1015 not supported (see #2507)");break;case 1016:this._coreMouseService.activeEncoding="SGR_PIXELS";break;case 25:this._coreService.isCursorHidden=!1;break;case 1048:this.saveCursor();break;case 1049:this.saveCursor();case 47:case 1047:this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!0}return!0}resetMode(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 4:this._coreService.modes.insertMode=!1;break;case 20:this._optionsService.options.convertEol=!1}return!0}resetModePrivate(e){for(let t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!1;break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(80,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!1,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!1;break;case 12:this._optionsService.options.cursorBlink=!1;break;case 45:this._coreService.decPrivateModes.reverseWraparound=!1;break;case 66:this._logService.debug("Switching back to normal keypad."),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire();break;case 9:case 1e3:case 1002:case 1003:this._coreMouseService.activeProtocol="NONE";break;case 1004:this._coreService.decPrivateModes.sendFocus=!1;break;case 1005:this._logService.debug("DECRST 1005 not supported (see #2507)");break;case 1006:case 1016:this._coreMouseService.activeEncoding="DEFAULT";break;case 1015:this._logService.debug("DECRST 1015 not supported (see #2507)");break;case 25:this._coreService.isCursorHidden=!0;break;case 1048:this.restoreCursor();break;case 1049:case 47:case 1047:this._bufferService.buffers.activateNormalBuffer(),1049===e.params[t]&&this.restoreCursor(),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!1}return!0}requestMode(e,t){const i=this._coreService.decPrivateModes,{activeProtocol:s,activeEncoding:r}=this._coreMouseService,o=this._coreService,{buffers:a,cols:h}=this._bufferService,{active:c,alt:l}=a,d=this._optionsService.rawOptions,_=e=>e?1:2,u=e.params[0];return f=u,v=t?2===u?4:4===u?_(o.modes.insertMode):12===u?3:20===u?_(d.convertEol):0:1===u?_(i.applicationCursorKeys):3===u?d.windowOptions.setWinLines?80===h?2:132===h?1:0:0:6===u?_(i.origin):7===u?_(i.wraparound):8===u?3:9===u?_("X10"===s):12===u?_(d.cursorBlink):25===u?_(!o.isCursorHidden):45===u?_(i.reverseWraparound):66===u?_(i.applicationKeypad):67===u?4:1e3===u?_("VT200"===s):1002===u?_("DRAG"===s):1003===u?_("ANY"===s):1004===u?_(i.sendFocus):1005===u?4:1006===u?_("SGR"===r):1015===u?4:1016===u?_("SGR_PIXELS"===r):1048===u?1:47===u||1047===u||1049===u?_(c===l):2004===u?_(i.bracketedPasteMode):0,o.triggerDataEvent(`${n.C0.ESC}[${t?"":"?"}${f};${v}$y`),!0;var f,v}_updateAttrColor(e,t,i,s,r){return 2===t?(e|=50331648,e&=-16777216,e|=f.AttributeData.fromColorRGB([i,s,r])):5===t&&(e&=-50331904,e|=33554432|255&i),e}_extractColor(e,t,i){const s=[0,0,-1,0,0,0];let r=0,n=0;do{if(s[n+r]=e.params[t+n],e.hasSubParams(t+n)){const i=e.getSubParams(t+n);let o=0;do{5===s[1]&&(r=1),s[n+o+1+r]=i[o]}while(++o<i.length&&o+n+1+r<s.length);break}if(5===s[1]&&n+r>=2||2===s[1]&&n+r>=5)break;s[1]&&(r=1)}while(++n+t<e.length&&n+r<s.length);for(let e=2;e<s.length;++e)-1===s[e]&&(s[e]=0);switch(s[0]){case 38:i.fg=this._updateAttrColor(i.fg,s[1],s[3],s[4],s[5]);break;case 48:i.bg=this._updateAttrColor(i.bg,s[1],s[3],s[4],s[5]);break;case 58:i.extended=i.extended.clone(),i.extended.underlineColor=this._updateAttrColor(i.extended.underlineColor,s[1],s[3],s[4],s[5])}return n}_processUnderline(e,t){t.extended=t.extended.clone(),(!~e||e>5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()}_processSGR0(e){e.fg=l.DEFAULT_ATTR_DATA.fg,e.bg=l.DEFAULT_ATTR_DATA.bg,e.extended=e.extended.clone(),e.extended.underlineStyle=0,e.extended.underlineColor&=-67108864,e.updateExtended()}charAttributes(e){if(1===e.length&&0===e.params[0])return this._processSGR0(this._curAttrData),!0;const t=e.length;let i;const s=this._curAttrData;for(let r=0;r<t;r++)i=e.params[r],i>=30&&i<=37?(s.fg&=-50331904,s.fg|=16777216|i-30):i>=40&&i<=47?(s.bg&=-50331904,s.bg|=16777216|i-40):i>=90&&i<=97?(s.fg&=-50331904,s.fg|=16777224|i-90):i>=100&&i<=107?(s.bg&=-50331904,s.bg|=16777224|i-100):0===i?this._processSGR0(s):1===i?s.fg|=134217728:3===i?s.bg|=67108864:4===i?(s.fg|=268435456,this._processUnderline(e.hasSubParams(r)?e.getSubParams(r)[0]:1,s)):5===i?s.fg|=536870912:7===i?s.fg|=67108864:8===i?s.fg|=1073741824:9===i?s.fg|=2147483648:2===i?s.bg|=134217728:21===i?this._processUnderline(2,s):22===i?(s.fg&=-134217729,s.bg&=-134217729):23===i?s.bg&=-67108865:24===i?(s.fg&=-268435457,this._processUnderline(0,s)):25===i?s.fg&=-536870913:27===i?s.fg&=-67108865:28===i?s.fg&=-1073741825:29===i?s.fg&=2147483647:39===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg):49===i?(s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):38===i||48===i||58===i?r+=this._extractColor(e,r,s):53===i?s.bg|=1073741824:55===i?s.bg&=-1073741825:59===i?(s.extended=s.extended.clone(),s.extended.underlineColor=-1,s.updateExtended()):100===i?(s.fg&=-67108864,s.fg|=16777215&l.DEFAULT_ATTR_DATA.fg,s.bg&=-67108864,s.bg|=16777215&l.DEFAULT_ATTR_DATA.bg):this._logService.debug("Unknown SGR attribute: %d.",i);return!0}deviceStatus(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(`${n.C0.ESC}[0n`);break;case 6:const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[${e};${t}R`)}return!0}deviceStatusPrivate(e){if(6===e.params[0]){const e=this._activeBuffer.y+1,t=this._activeBuffer.x+1;this._coreService.triggerDataEvent(`${n.C0.ESC}[?${e};${t}R`)}return!0}softReset(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0}setCursorStyle(e){const t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle="block";break;case 3:case 4:this._optionsService.options.cursorStyle="underline";break;case 5:case 6:this._optionsService.options.cursorStyle="bar"}const i=t%2==1;return this._optionsService.options.cursorBlink=i,!0}setScrollRegion(e){const t=e.params[0]||1;let i;return(e.length<2||(i=e.params[1])>this._bufferService.rows||0===i)&&(i=this._bufferService.rows),i>t&&(this._activeBuffer.scrollTop=t-1,this._activeBuffer.scrollBottom=i-1,this._setCursor(0,0)),!0}windowOptions(e){if(!w(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;const t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(y.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(y.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(`${n.C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0}saveCursor(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0}restoreCursor(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0}setTitle(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0}setIconName(e){return this._iconName=e,!0}setOrReportIndexedColor(e){const t=[],i=e.split(";");for(;i.length>1;){const e=i.shift(),s=i.shift();if(/^\d+$/.exec(e)){const i=parseInt(e);if(D(i))if("?"===s)t.push({type:0,index:i});else{const e=(0,S.parseColor)(s);e&&t.push({type:1,index:i,color:e})}}}return t.length&&this._onColor.fire(t),!0}setHyperlink(e){const t=e.split(";");return!(t.length<2)&&(t[1]?this._createHyperlink(t[0],t[1]):!t[0]&&this._finishHyperlink())}_createHyperlink(e,t){this._getCurrentLinkId()&&this._finishHyperlink();const i=e.split(":");let s;const r=i.findIndex((e=>e.startsWith("id=")));return-1!==r&&(s=i[r].slice(3)||void 0),this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=this._oscLinkService.registerLink({id:s,uri:t}),this._curAttrData.updateExtended(),!0}_finishHyperlink(){return this._curAttrData.extended=this._curAttrData.extended.clone(),this._curAttrData.extended.urlId=0,this._curAttrData.updateExtended(),!0}_setOrReportSpecialColor(e,t){const i=e.split(";");for(let e=0;e<i.length&&!(t>=this._specialColors.length);++e,++t)if("?"===i[e])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{const s=(0,S.parseColor)(i[e]);s&&this._onColor.fire([{type:1,index:this._specialColors[t],color:s}])}return!0}setOrReportFgColor(e){return this._setOrReportSpecialColor(e,0)}setOrReportBgColor(e){return this._setOrReportSpecialColor(e,1)}setOrReportCursorColor(e){return this._setOrReportSpecialColor(e,2)}restoreIndexedColor(e){if(!e)return this._onColor.fire([{type:2}]),!0;const t=[],i=e.split(";");for(let e=0;e<i.length;++e)if(/^\d+$/.exec(i[e])){const s=parseInt(i[e]);D(s)&&t.push({type:2,index:s})}return t.length&&this._onColor.fire(t),!0}restoreFgColor(e){return this._onColor.fire([{type:2,index:256}]),!0}restoreBgColor(e){return this._onColor.fire([{type:2,index:257}]),!0}restoreCursorColor(e){return this._onColor.fire([{type:2,index:258}]),!0}nextLine(){return this._activeBuffer.x=0,this.index(),!0}keypadApplicationMode(){return this._logService.debug("Serial port requested application keypad."),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire(),!0}keypadNumericMode(){return this._logService.debug("Switching back to normal keypad."),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire(),!0}selectDefaultCharset(){return this._charsetService.setgLevel(0),this._charsetService.setgCharset(0,o.DEFAULT_CHARSET),!0}selectCharset(e){return 2!==e.length?(this.selectDefaultCharset(),!0):("/"===e[0]||this._charsetService.setgCharset(C[e[0]],o.CHARSETS[e[1]]||o.DEFAULT_CHARSET),!0)}index(){return this._restrictCursor(),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0}tabSet(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0}reverseIndex(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){const e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowTracker.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0}fullReset(){return this._parser.reset(),this._onRequestReset.fire(),!0}reset(){this._curAttrData=l.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=l.DEFAULT_ATTR_DATA.clone()}_eraseAttrData(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal}setgLevel(e){return this._charsetService.setgLevel(e),!0}screenAlignmentPattern(){const e=new u.CellData;e.content=1<<22|"E".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(let t=0;t<this._bufferService.rows;++t){const i=this._activeBuffer.ybase+this._activeBuffer.y+t,s=this._activeBuffer.lines.get(i);s&&(s.fill(e),s.isWrapped=!1)}return this._dirtyRowTracker.markAllDirty(),this._setCursor(0,0),!0}requestStatusString(e,t){const i=this._bufferService.buffer,s=this._optionsService.rawOptions;return(e=>(this._coreService.triggerDataEvent(`${n.C0.ESC}${e}${n.C0.ESC}\\`),!0))('"q'===e?`P1$r${this._curAttrData.isProtected()?1:0}"q`:'"p'===e?'P1$r61;1"p':"r"===e?`P1$r${i.scrollTop+1};${i.scrollBottom+1}r`:"m"===e?"P1$r0m":" q"===e?`P1$r${{block:2,underline:4,bar:6}[s.cursorStyle]-(s.cursorBlink?1:0)} q`:"P0$r")}markRangeDirty(e,t){this._dirtyRowTracker.markRangeDirty(e,t)}}t.InputHandler=k;let L=class{constructor(e){this._bufferService=e,this.clearRange()}clearRange(){this.start=this._bufferService.buffer.y,this.end=this._bufferService.buffer.y}markDirty(e){e<this.start?this.start=e:e>this.end&&(this.end=e)}markRangeDirty(e,t){e>t&&(E=e,e=t,t=E),e<this.start&&(this.start=e),t>this.end&&(this.end=t)}markAllDirty(){this.markRangeDirty(0,this._bufferService.rows-1)}};function D(e){return 0<=e&&e<256}L=s([r(0,v.IBufferService)],L)},844:(e,t)=>{function i(e){for(const t of e)t.dispose();e.length=0}Object.defineProperty(t,"__esModule",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.toDisposable=t.MutableDisposable=t.Disposable=void 0,t.Disposable=class{constructor(){this._disposables=[],this._isDisposed=!1}dispose(){this._isDisposed=!0;for(const e of this._disposables)e.dispose();this._disposables.length=0}register(e){return this._disposables.push(e),e}unregister(e){const t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)}},t.MutableDisposable=class{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,this._value?.dispose(),this._value=void 0}},t.toDisposable=function(e){return{dispose:e}},t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:()=>i(e)}}},1505:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.FourKeyMap=t.TwoKeyMap=void 0;class i{constructor(){this._data={}}set(e,t,i){this._data[e]||(this._data[e]={}),this._data[e][t]=i}get(e,t){return this._data[e]?this._data[e][t]:void 0}clear(){this._data={}}}t.TwoKeyMap=i,t.FourKeyMap=class{constructor(){this._data=new i}set(e,t,s,r,n){this._data.get(e,t)||this._data.set(e,t,new i),this._data.get(e,t).set(s,r,n)}get(e,t,i,s){return this._data.get(e,t)?.get(i,s)}clear(){this._data.clear()}}},6114:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.isChromeOS=t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.getSafariVersion=t.isSafari=t.isLegacyEdge=t.isFirefox=t.isNode=void 0,t.isNode="undefined"!=typeof process&&"title"in process;const i=t.isNode?"node":navigator.userAgent,s=t.isNode?"node":navigator.platform;t.isFirefox=i.includes("Firefox"),t.isLegacyEdge=i.includes("Edge"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.getSafariVersion=function(){if(!t.isSafari)return 0;const e=i.match(/Version\/(\d+)/);return null===e||e.length<2?0:parseInt(e[1])},t.isMac=["Macintosh","MacIntel","MacPPC","Mac68K"].includes(s),t.isIpad="iPad"===s,t.isIphone="iPhone"===s,t.isWindows=["Windows","Win16","Win32","WinCE"].includes(s),t.isLinux=s.indexOf("Linux")>=0,t.isChromeOS=/\bCrOS\b/.test(i)},6106:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.SortedList=void 0;let i=0;t.SortedList=class{constructor(e){this._getKey=e,this._array=[]}clear(){this._array.length=0}insert(e){0!==this._array.length?(i=this._search(this._getKey(e)),this._array.splice(i,0,e)):this._array.push(e)}delete(e){if(0===this._array.length)return!1;const t=this._getKey(e);if(void 0===t)return!1;if(i=this._search(t),-1===i)return!1;if(this._getKey(this._array[i])!==t)return!1;do{if(this._array[i]===e)return this._array.splice(i,1),!0}while(++i<this._array.length&&this._getKey(this._array[i])===t);return!1}*getKeyIterator(e){if(0!==this._array.length&&(i=this._search(e),!(i<0||i>=this._array.length)&&this._getKey(this._array[i])===e))do{yield this._array[i]}while(++i<this._array.length&&this._getKey(this._array[i])===e)}forEachByKey(e,t){if(0!==this._array.length&&(i=this._search(e),!(i<0||i>=this._array.length)&&this._getKey(this._array[i])===e))do{t(this._array[i])}while(++i<this._array.length&&this._getKey(this._array[i])===e)}values(){return[...this._array].values()}_search(e){let t=0,i=this._array.length-1;for(;i>=t;){let s=t+i>>1;const r=this._getKey(this._array[s]);if(r>e)i=s-1;else{if(!(r<e)){for(;s>0&&this._getKey(this._array[s-1])===e;)s--;return s}t=s+1}}return t}}},7226:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DebouncedIdleTask=t.IdleTaskQueue=t.PriorityTaskQueue=void 0;const s=i(6114);class r{constructor(){this._tasks=[],this._i=0}enqueue(e){this._tasks.push(e),this._start()}flush(){for(;this._i<this._tasks.length;)this._tasks[this._i]()||this._i++;this.clear()}clear(){this._idleCallback&&(this._cancelCallback(this._idleCallback),this._idleCallback=void 0),this._i=0,this._tasks.length=0}_start(){this._idleCallback||(this._idleCallback=this._requestCallback(this._process.bind(this)))}_process(e){this._idleCallback=void 0;let t=0,i=0,s=e.timeRemaining(),r=0;for(;this._i<this._tasks.length;){if(t=Date.now(),this._tasks[this._i]()||this._i++,t=Math.max(1,Date.now()-t),i=Math.max(t,i),r=e.timeRemaining(),1.5*i>r)return s-t<-20&&console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(s-t))}ms`),void this._start();s=r}this.clear()}}class n extends r{_requestCallback(e){return setTimeout((()=>e(this._createDeadline(16))))}_cancelCallback(e){clearTimeout(e)}_createDeadline(e){const t=Date.now()+e;return{timeRemaining:()=>Math.max(0,t-Date.now())}}}t.PriorityTaskQueue=n,t.IdleTaskQueue=!s.isNode&&"requestIdleCallback"in window?class extends r{_requestCallback(e){return requestIdleCallback(e)}_cancelCallback(e){cancelIdleCallback(e)}}:n,t.DebouncedIdleTask=class{constructor(){this._queue=new t.IdleTaskQueue}set(e){this._queue.clear(),this._queue.enqueue(e)}flush(){this._queue.flush()}}},9282:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.updateWindowsModeWrappedState=void 0;const s=i(643);t.updateWindowsModeWrappedState=function(e){const t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),i=t?.get(e.cols-1),r=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);r&&i&&(r.isWrapped=i[s.CHAR_DATA_CODE_INDEX]!==s.NULL_CELL_CODE&&i[s.CHAR_DATA_CODE_INDEX]!==s.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;class i{constructor(){this.fg=0,this.bg=0,this.extended=new s}static toColorRGB(e){return[e>>>16&255,e>>>8&255,255&e]}static fromColorRGB(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]}clone(){const e=new i;return e.fg=this.fg,e.bg=this.bg,e.extended=this.extended.clone(),e}isInverse(){return 67108864&this.fg}isBold(){return 134217728&this.fg}isUnderline(){return this.hasExtendedAttrs()&&0!==this.extended.underlineStyle?1:268435456&this.fg}isBlink(){return 536870912&this.fg}isInvisible(){return 1073741824&this.fg}isItalic(){return 67108864&this.bg}isDim(){return 134217728&this.bg}isStrikethrough(){return 2147483648&this.fg}isProtected(){return 536870912&this.bg}isOverline(){return 1073741824&this.bg}getFgColorMode(){return 50331648&this.fg}getBgColorMode(){return 50331648&this.bg}isFgRGB(){return 50331648==(50331648&this.fg)}isBgRGB(){return 50331648==(50331648&this.bg)}isFgPalette(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)}isBgPalette(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)}isFgDefault(){return 0==(50331648&this.fg)}isBgDefault(){return 0==(50331648&this.bg)}isAttributeDefault(){return 0===this.fg&&0===this.bg}getFgColor(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}}getBgColor(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}}hasExtendedAttrs(){return 268435456&this.bg}updateExtended(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456}getUnderlineColor(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()}getUnderlineColorMode(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()}isUnderlineColorRGB(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()}isUnderlineColorPalette(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()}isUnderlineColorDefault(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()}getUnderlineStyle(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0}getUnderlineVariantOffset(){return this.extended.underlineVariantOffset}}t.AttributeData=i;class s{get ext(){return this._urlId?-469762049&this._ext|this.underlineStyle<<26:this._ext}set ext(e){this._ext=e}get underlineStyle(){return this._urlId?5:(469762048&this._ext)>>26}set underlineStyle(e){this._ext&=-469762049,this._ext|=e<<26&469762048}get underlineColor(){return 67108863&this._ext}set underlineColor(e){this._ext&=-67108864,this._ext|=67108863&e}get urlId(){return this._urlId}set urlId(e){this._urlId=e}get underlineVariantOffset(){const e=(3758096384&this._ext)>>29;return e<0?4294967288^e:e}set underlineVariantOffset(e){this._ext&=536870911,this._ext|=e<<29&3758096384}constructor(e=0,t=0){this._ext=0,this._urlId=0,this._ext=e,this._urlId=t}clone(){return new s(this._ext,this._urlId)}isEmpty(){return 0===this.underlineStyle&&0===this._urlId}}t.ExtendedAttrs=s},9092:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Buffer=t.MAX_BUFFER_SIZE=void 0;const s=i(6349),r=i(7226),n=i(3734),o=i(8437),a=i(4634),h=i(511),c=i(643),l=i(4863),d=i(7116);t.MAX_BUFFER_SIZE=4294967295,t.Buffer=class{constructor(e,t,i){this._hasScrollback=e,this._optionsService=t,this._bufferService=i,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.tabs={},this.savedY=0,this.savedX=0,this.savedCurAttrData=o.DEFAULT_ATTR_DATA.clone(),this.savedCharset=d.DEFAULT_CHARSET,this.markers=[],this._nullCell=h.CellData.fromCharData([0,c.NULL_CELL_CHAR,c.NULL_CELL_WIDTH,c.NULL_CELL_CODE]),this._whitespaceCell=h.CellData.fromCharData([0,c.WHITESPACE_CELL_CHAR,c.WHITESPACE_CELL_WIDTH,c.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._memoryCleanupQueue=new r.IdleTaskQueue,this._memoryCleanupPosition=0,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}getNullCell(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new n.ExtendedAttrs),this._nullCell}getWhitespaceCell(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new n.ExtendedAttrs),this._whitespaceCell}getBlankLine(e,t){return new o.BufferLine(this._bufferService.cols,this.getNullCell(e),t)}get hasScrollback(){return this._hasScrollback&&this.lines.maxLength>this._rows}get isCursorInViewport(){const e=this.ybase+this.y-this.ydisp;return e>=0&&e<this._rows}_getCorrectBufferLength(e){if(!this._hasScrollback)return e;const i=e+this._optionsService.rawOptions.scrollback;return i>t.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:i}fillViewportRows(e){if(0===this.lines.length){void 0===e&&(e=o.DEFAULT_ATTR_DATA);let t=this._rows;for(;t--;)this.lines.push(this.getBlankLine(e))}}clear(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new s.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}resize(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA);let s=0;const r=this._getCorrectBufferLength(t);if(r>this.lines.maxLength&&(this.lines.maxLength=r),this.lines.length>0){if(this._cols<e)for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);let n=0;if(this._rows<t)for(let s=this._rows;s<t;s++)this.lines.length<t+this.ybase&&(this._optionsService.rawOptions.windowsMode||void 0!==this._optionsService.rawOptions.windowsPty.backend||void 0!==this._optionsService.rawOptions.windowsPty.buildNumber?this.lines.push(new o.BufferLine(e,i)):this.ybase>0&&this.lines.length<=this.ybase+this.y+n+1?(this.ybase--,n++,this.ydisp>0&&this.ydisp--):this.lines.push(new o.BufferLine(e,i)));else for(let e=this._rows;e>t;e--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(r<this.lines.maxLength){const e=this.lines.length-r;e>0&&(this.lines.trimStart(e),this.ybase=Math.max(this.ybase-e,0),this.ydisp=Math.max(this.ydisp-e,0),this.savedY=Math.max(this.savedY-e,0)),this.lines.maxLength=r}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),n&&(this.y+=n),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(let t=0;t<this.lines.length;t++)s+=+this.lines.get(t).resize(e,i);this._cols=e,this._rows=t,this._memoryCleanupQueue.clear(),s>.1*this.lines.length&&(this._memoryCleanupPosition=0,this._memoryCleanupQueue.enqueue((()=>this._batchedMemoryCleanup())))}_batchedMemoryCleanup(){let e=!0;this._memoryCleanupPosition>=this.lines.length&&(this._memoryCleanupPosition=0,e=!1);let t=0;for(;this._memoryCleanupPosition<this.lines.length;)if(t+=this.lines.get(this._memoryCleanupPosition++).cleanupMemory(),t>100)return!0;return e}get _isReflowEnabled(){const e=this._optionsService.rawOptions.windowsPty;return e&&e.buildNumber?this._hasScrollback&&"conpty"===e.backend&&e.buildNumber>=21376:this._hasScrollback&&!this._optionsService.rawOptions.windowsMode}_reflow(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))}_reflowLarger(e,t){const i=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(o.DEFAULT_ATTR_DATA));if(i.length>0){const s=(0,a.reflowLargerCreateNewLayout)(this.lines,i);(0,a.reflowLargerApplyNewLayout)(this.lines,s.layout),this._reflowLargerAdjustViewport(e,t,s.countRemoved)}}_reflowLargerAdjustViewport(e,t,i){const s=this.getNullCell(o.DEFAULT_ATTR_DATA);let r=i;for(;r-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length<t&&this.lines.push(new o.BufferLine(e,s))):(this.ydisp===this.ybase&&this.ydisp--,this.ybase--);this.savedY=Math.max(this.savedY-i,0)}_reflowSmaller(e,t){const i=this.getNullCell(o.DEFAULT_ATTR_DATA),s=[];let r=0;for(let n=this.lines.length-1;n>=0;n--){let h=this.lines.get(n);if(!h||!h.isWrapped&&h.getTrimmedLength()<=e)continue;const c=[h];for(;h.isWrapped&&n>0;)h=this.lines.get(--n),c.unshift(h);const l=this.ybase+this.y;if(l>=n&&l<n+c.length)continue;const d=c[c.length-1].getTrimmedLength(),_=(0,a.reflowSmallerGetNewLineLengths)(c,this._cols,e),u=_.length-c.length;let f;f=0===this.ybase&&this.y!==this.lines.length-1?Math.max(0,this.y-this.lines.maxLength+u):Math.max(0,this.lines.length-this.lines.maxLength+u);const v=[];for(let e=0;e<u;e++){const e=this.getBlankLine(o.DEFAULT_ATTR_DATA,!0);v.push(e)}v.length>0&&(s.push({start:n+c.length+r,newLines:v}),r+=v.length),c.push(...v);let p=_.length-1,g=_[p];0===g&&(p--,g=_[p]);let m=c.length-u-1,S=d;for(;m>=0;){const e=Math.min(S,g);if(void 0===c[p])break;if(c[p].copyCellsFrom(c[m],S-e,g-e,e,!0),g-=e,0===g&&(p--,g=_[p]),S-=e,0===S){m--;const e=Math.max(m,0);S=(0,a.getWrappedLineTrimmedLength)(c,e,this._cols)}}for(let t=0;t<c.length;t++)_[t]<e&&c[t].setCell(_[t],i);let C=u-f;for(;C-- >0;)0===this.ybase?this.y<t-1?(this.y++,this.lines.pop()):(this.ybase++,this.ydisp++):this.ybase<Math.min(this.lines.maxLength,this.lines.length+r)-t&&(this.ybase===this.ydisp&&this.ydisp++,this.ybase++);this.savedY=Math.min(this.savedY+u,this.ybase+t-1)}if(s.length>0){const e=[],t=[];for(let e=0;e<this.lines.length;e++)t.push(this.lines.get(e));const i=this.lines.length;let n=i-1,o=0,a=s[o];this.lines.length=Math.min(this.lines.maxLength,this.lines.length+r);let h=0;for(let c=Math.min(this.lines.maxLength-1,i+r-1);c>=0;c--)if(a&&a.start>n+h){for(let e=a.newLines.length-1;e>=0;e--)this.lines.set(c--,a.newLines[e]);c++,e.push({index:n+1,amount:a.newLines.length}),h+=a.newLines.length,a=s[++o]}else this.lines.set(c,t[n--]);let c=0;for(let t=e.length-1;t>=0;t--)e[t].index+=c,this.lines.onInsertEmitter.fire(e[t]),c+=e[t].amount;const l=Math.max(0,i+r-this.lines.maxLength);l>0&&this.lines.onTrimEmitter.fire(l)}}translateBufferLineToString(e,t,i=0,s){const r=this.lines.get(e);return r?r.translateToString(t,i,s):""}getWrappedRangeForLine(e){let t=e,i=e;for(;t>0&&this.lines.get(t).isWrapped;)t--;for(;i+1<this.lines.length&&this.lines.get(i+1).isWrapped;)i++;return{first:t,last:i}}setupTabStops(e){for(null!=e?this.tabs[e]||(e=this.prevStop(e)):(this.tabs={},e=0);e<this._cols;e+=this._optionsService.rawOptions.tabStopWidth)this.tabs[e]=!0}prevStop(e){for(null==e&&(e=this.x);!this.tabs[--e]&&e>0;);return e>=this._cols?this._cols-1:e<0?0:e}nextStop(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e<this._cols;);return e>=this._cols?this._cols-1:e<0?0:e}clearMarkers(e){this._isClearing=!0;for(let t=0;t<this.markers.length;t++)this.markers[t].line===e&&(this.markers[t].dispose(),this.markers.splice(t--,1));this._isClearing=!1}clearAllMarkers(){this._isClearing=!0;for(let e=0;e<this.markers.length;e++)this.markers[e].dispose(),this.markers.splice(e--,1);this._isClearing=!1}addMarker(e){const t=new l.Marker(e);return this.markers.push(t),t.register(this.lines.onTrim((e=>{t.line-=e,t.line<0&&t.dispose()}))),t.register(this.lines.onInsert((e=>{t.line>=e.index&&(t.line+=e.amount)}))),t.register(this.lines.onDelete((e=>{t.line>=e.index&&t.line<e.index+e.amount&&t.dispose(),t.line>e.index&&(t.line-=e.amount)}))),t.register(t.onDispose((()=>this._removeMarker(t)))),t}_removeMarker(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)}}},8437:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;const s=i(3734),r=i(511),n=i(643),o=i(482);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);let a=0;class h{constructor(e,t,i=!1){this.isWrapped=i,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);const s=t||r.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]);for(let t=0;t<e;++t)this.setCell(t,s);this.length=e}get(e){const t=this._data[3*e+0],i=2097151&t;return[this._data[3*e+1],2097152&t?this._combined[e]:i?(0,o.stringFromCodePoint)(i):"",t>>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):i]}set(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22}getWidth(e){return this._data[3*e+0]>>22}hasWidth(e){return 12582912&this._data[3*e+0]}getFg(e){return this._data[3*e+1]}getBg(e){return this._data[3*e+2]}hasContent(e){return 4194303&this._data[3*e+0]}getCodePoint(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t}isCombined(e){return 2097152&this._data[3*e+0]}getString(e){const t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,o.stringFromCodePoint)(2097151&t):""}isProtected(e){return 536870912&this._data[3*e+2]}loadCell(e,t){return a=3*e,t.content=this._data[a+0],t.fg=this._data[a+1],t.bg=this._data[a+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t}setCell(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg}setCellFromCodepoint(e,t,i,s){268435456&s.bg&&(this._extendedAttrs[e]=s.extended),this._data[3*e+0]=t|i<<22,this._data[3*e+1]=s.fg,this._data[3*e+2]=s.bg}addCodepointToCell(e,t,i){let s=this._data[3*e+0];2097152&s?this._combined[e]+=(0,o.stringFromCodePoint)(t):2097151&s?(this._combined[e]=(0,o.stringFromCodePoint)(2097151&s)+(0,o.stringFromCodePoint)(t),s&=-2097152,s|=2097152):s=t|1<<22,i&&(s&=-12582913,s|=i<<22),this._data[3*e+0]=s}insertCells(e,t,i){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t<this.length-e){const s=new r.CellData;for(let i=this.length-e-t-1;i>=0;--i)this.setCell(e+t+i,this.loadCell(e+i,s));for(let s=0;s<t;++s)this.setCell(e+s,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);2===this.getWidth(this.length-1)&&this.setCellFromCodepoint(this.length-1,0,1,i)}deleteCells(e,t,i){if(e%=this.length,t<this.length-e){const s=new r.CellData;for(let i=0;i<this.length-e-t;++i)this.setCell(e+i,this.loadCell(e+t+i,s));for(let e=this.length-t;e<this.length;++e)this.setCell(e,i)}else for(let t=e;t<this.length;++t)this.setCell(t,i);e&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),0!==this.getWidth(e)||this.hasContent(e)||this.setCellFromCodepoint(e,0,1,i)}replaceCells(e,t,i,s=!1){if(s)for(e&&2===this.getWidth(e-1)&&!this.isProtected(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t<this.length&&2===this.getWidth(t-1)&&!this.isProtected(t)&&this.setCellFromCodepoint(t,0,1,i);e<t&&e<this.length;)this.isProtected(e)||this.setCell(e,i),e++;else for(e&&2===this.getWidth(e-1)&&this.setCellFromCodepoint(e-1,0,1,i),t<this.length&&2===this.getWidth(t-1)&&this.setCellFromCodepoint(t,0,1,i);e<t&&e<this.length;)this.setCell(e++,i)}resize(e,t){if(e===this.length)return 4*this._data.length*2<this._data.buffer.byteLength;const i=3*e;if(e>this.length){if(this._data.buffer.byteLength>=4*i)this._data=new Uint32Array(this._data.buffer,0,i);else{const e=new Uint32Array(i);e.set(this._data),this._data=e}for(let i=this.length;i<e;++i)this.setCell(i,t)}else{this._data=this._data.subarray(0,i);const t=Object.keys(this._combined);for(let i=0;i<t.length;i++){const s=parseInt(t[i],10);s>=e&&delete this._combined[s]}const s=Object.keys(this._extendedAttrs);for(let t=0;t<s.length;t++){const i=parseInt(s[t],10);i>=e&&delete this._extendedAttrs[i]}}return this.length=e,4*i*2<this._data.buffer.byteLength}cleanupMemory(){if(4*this._data.length*2<this._data.buffer.byteLength){const e=new Uint32Array(this._data.length);return e.set(this._data),this._data=e,1}return 0}fill(e,t=!1){if(t)for(let t=0;t<this.length;++t)this.isProtected(t)||this.setCell(t,e);else{this._combined={},this._extendedAttrs={};for(let t=0;t<this.length;++t)this.setCell(t,e)}}copyFrom(e){this.length!==e.length?this._data=new Uint32Array(e._data):this._data.set(e._data),this.length=e.length,this._combined={};for(const t in e._combined)this._combined[t]=e._combined[t];this._extendedAttrs={};for(const t in e._extendedAttrs)this._extendedAttrs[t]=e._extendedAttrs[t];this.isWrapped=e.isWrapped}clone(){const e=new h(0);e._data=new Uint32Array(this._data),e.length=this.length;for(const t in this._combined)e._combined[t]=this._combined[t];for(const t in this._extendedAttrs)e._extendedAttrs[t]=this._extendedAttrs[t];return e.isWrapped=this.isWrapped,e}getTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0}getNoBgTrimmedLength(){for(let e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0]||50331648&this._data[3*e+2])return e+(this._data[3*e+0]>>22);return 0}copyCellsFrom(e,t,i,s,r){const n=e._data;if(r)for(let r=s-1;r>=0;r--){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}else for(let r=0;r<s;r++){for(let e=0;e<3;e++)this._data[3*(i+r)+e]=n[3*(t+r)+e];268435456&n[3*(t+r)+2]&&(this._extendedAttrs[i+r]=e._extendedAttrs[t+r])}const o=Object.keys(e._combined);for(let s=0;s<o.length;s++){const r=parseInt(o[s],10);r>=t&&(this._combined[r-t+i]=e._combined[r])}}translateToString(e,t,i,s){t=t??0,i=i??this.length,e&&(i=Math.min(i,this.getTrimmedLength())),s&&(s.length=0);let r="";for(;t<i;){const e=this._data[3*t+0],i=2097151&e,a=2097152&e?this._combined[t]:i?(0,o.stringFromCodePoint)(i):n.WHITESPACE_CELL_CHAR;if(r+=a,s)for(let e=0;e<a.length;++e)s.push(t);t+=e>>22||1}return s&&s.push(t),r}}t.BufferLine=h},4841:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(`Buffer range end (${e.end.x}, ${e.end.y}) cannot be before start (${e.start.x}, ${e.start.y})`);return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function i(e,t,i){if(t===e.length-1)return e[t].getTrimmedLength();const s=!e[t].hasContent(i-1)&&1===e[t].getWidth(i-1),r=2===e[t+1].getWidth(0);return s&&r?i-1:i}Object.defineProperty(t,"__esModule",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,s,r,n){const o=[];for(let a=0;a<e.length-1;a++){let h=a,c=e.get(++h);if(!c.isWrapped)continue;const l=[e.get(a)];for(;h<e.length&&c.isWrapped;)l.push(c),c=e.get(++h);if(r>=a&&r<h){a+=l.length-1;continue}let d=0,_=i(l,d,t),u=1,f=0;for(;u<l.length;){const e=i(l,u,t),r=e-f,o=s-_,a=Math.min(r,o);l[d].copyCellsFrom(l[u],f,_,a,!1),_+=a,_===s&&(d++,_=0),f+=a,f===e&&(u++,f=0),0===_&&0!==d&&2===l[d-1].getWidth(s-1)&&(l[d].copyCellsFrom(l[d-1],s-1,_++,1,!1),l[d-1].setCell(s-1,n))}l[d].replaceCells(_,s,n);let v=0;for(let e=l.length-1;e>0&&(e>d||0===l[e].getTrimmedLength());e--)v++;v>0&&(o.push(a+l.length-v),o.push(v)),a+=l.length-1}return o},t.reflowLargerCreateNewLayout=function(e,t){const i=[];let s=0,r=t[s],n=0;for(let o=0;o<e.length;o++)if(r===o){const i=t[++s];e.onDeleteEmitter.fire({index:o-n,amount:i}),o+=i-1,n+=i,r=t[++s]}else i.push(o);return{layout:i,countRemoved:n}},t.reflowLargerApplyNewLayout=function(e,t){const i=[];for(let s=0;s<t.length;s++)i.push(e.get(t[s]));for(let t=0;t<i.length;t++)e.set(t,i[t]);e.length=t.length},t.reflowSmallerGetNewLineLengths=function(e,t,s){const r=[],n=e.map(((s,r)=>i(e,r,t))).reduce(((e,t)=>e+t));let o=0,a=0,h=0;for(;h<n;){if(n-h<s){r.push(n-h);break}o+=s;const c=i(e,a,t);o>c&&(o-=c,a++);const l=2===e[a].getWidth(o-1);l&&o--;const d=l?s-1:s;r.push(d),h+=d}return r},t.getWrappedLineTrimmedLength=i},5295:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferSet=void 0;const s=i(8460),r=i(844),n=i(9092);class o extends r.Disposable{constructor(e,t){super(),this._optionsService=e,this._bufferService=t,this._onBufferActivate=this.register(new s.EventEmitter),this.onBufferActivate=this._onBufferActivate.event,this.reset(),this.register(this._optionsService.onSpecificOptionChange("scrollback",(()=>this.resize(this._bufferService.cols,this._bufferService.rows)))),this.register(this._optionsService.onSpecificOptionChange("tabStopWidth",(()=>this.setupTabStops())))}reset(){this._normal=new n.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new n.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()}get alt(){return this._alt}get active(){return this._activeBuffer}get normal(){return this._normal}activateNormalBuffer(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clearAllMarkers(),this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))}activateAltBuffer(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))}resize(e,t){this._normal.resize(e,t),this._alt.resize(e,t),this.setupTabStops(e)}setupTabStops(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)}}t.BufferSet=o},511:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CellData=void 0;const s=i(482),r=i(643),n=i(3734);class o extends n.AttributeData{constructor(){super(...arguments),this.content=0,this.fg=0,this.bg=0,this.extended=new n.ExtendedAttrs,this.combinedData=""}static fromCharData(e){const t=new o;return t.setFromCharData(e),t}isCombined(){return 2097152&this.content}getWidth(){return this.content>>22}getChars(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,s.stringFromCodePoint)(2097151&this.content):""}getCode(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content}setFromCharData(e){this.fg=e[r.CHAR_DATA_ATTR_INDEX],this.bg=0;let t=!1;if(e[r.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[r.CHAR_DATA_CHAR_INDEX].length){const i=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=i&&i<=56319){const s=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=s&&s<=57343?this.content=1024*(i-55296)+s-56320+65536|e[r.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[r.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[r.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[r.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[r.CHAR_DATA_WIDTH_INDEX]<<22)}getAsCharData(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]}}t.CellData=o},643:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_EXT=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=0,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.DEFAULT_EXT=0,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR="",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=" ",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Marker=void 0;const s=i(8460),r=i(844);class n{get id(){return this._id}constructor(e){this.line=e,this.isDisposed=!1,this._disposables=[],this._id=n._nextId++,this._onDispose=this.register(new s.EventEmitter),this.onDispose=this._onDispose.event}dispose(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),(0,r.disposeArray)(this._disposables),this._disposables.length=0)}register(e){return this._disposables.push(e),e}}t.Marker=n,n._nextId=1},7116:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={"`":"◆",a:"▒",b:"␉",c:"␌",d:"␍",e:"␊",f:"°",g:"±",h:"",i:"␋",j:"┘",k:"┐",l:"┌",m:"└",n:"┼",o:"⎺",p:"⎻",q:"─",r:"⎼",s:"⎽",t:"├",u:"┤",v:"┴",w:"┬",x:"│",y:"≤",z:"≥","{":"π","|":"≠","}":"£","~":"·"},t.CHARSETS.A={"#":"£"},t.CHARSETS.B=void 0,t.CHARSETS[4]={"#":"£","@":"¾","[":"ij","\\":"½","]":"|","{":"¨","|":"f","}":"¼","~":"´"},t.CHARSETS.C=t.CHARSETS[5]={"[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS.R={"#":"£","@":"à","[":"°","\\":"ç","]":"§","{":"é","|":"ù","}":"è","~":"¨"},t.CHARSETS.Q={"@":"à","[":"â","\\":"ç","]":"ê","^":"î","`":"ô","{":"é","|":"ù","}":"è","~":"û"},t.CHARSETS.K={"@":"§","[":"Ä","\\":"Ö","]":"Ü","{":"ä","|":"ö","}":"ü","~":"ß"},t.CHARSETS.Y={"#":"£","@":"§","[":"°","\\":"ç","]":"é","`":"ù","{":"à","|":"ò","}":"è","~":"ì"},t.CHARSETS.E=t.CHARSETS[6]={"@":"Ä","[":"Æ","\\":"Ø","]":"Å","^":"Ü","`":"ä","{":"æ","|":"ø","}":"å","~":"ü"},t.CHARSETS.Z={"#":"£","@":"§","[":"¡","\\":"Ñ","]":"¿","{":"°","|":"ñ","}":"ç"},t.CHARSETS.H=t.CHARSETS[7]={"@":"É","[":"Ä","\\":"Ö","]":"Å","^":"Ü","`":"é","{":"ä","|":"ö","}":"å","~":"ü"},t.CHARSETS["="]={"#":"ù","@":"à","[":"é","\\":"ç","]":"ê","^":"î",_:"è","`":"ô","{":"ä","|":"ö","}":"ü","~":"û"}},2584:(e,t)=>{var i,s,r;Object.defineProperty(t,"__esModule",{value:!0}),t.C1_ESCAPED=t.C1=t.C0=void 0,function(e){e.NUL="\0",e.SOH="",e.STX="",e.ETX="",e.EOT="",e.ENQ="",e.ACK="",e.BEL="",e.BS="\b",e.HT="\t",e.LF="\n",e.VT="\v",e.FF="\f",e.CR="\r",e.SO="",e.SI="",e.DLE="",e.DC1="",e.DC2="",e.DC3="",e.DC4="",e.NAK="",e.SYN="",e.ETB="",e.CAN="",e.EM="",e.SUB="",e.ESC="",e.FS="",e.GS="",e.RS="",e.US="",e.SP=" ",e.DEL=""}(i||(t.C0=i={})),function(e){e.PAD="",e.HOP="",e.BPH="",e.NBH="",e.IND="",e.NEL="
",e.SSA="",e.ESA="",e.HTS="",e.HTJ="",e.VTS="",e.PLD="",e.PLU="",e.RI="",e.SS2="",e.SS3="",e.DCS="",e.PU1="",e.PU2="",e.STS="",e.CCH="",e.MW="",e.SPA="",e.EPA="",e.SOS="",e.SGCI="",e.SCI="",e.CSI="",e.ST="",e.OSC="",e.PM="",e.APC=""}(s||(t.C1=s={})),function(e){e.ST=`${i.ESC}\\`}(r||(t.C1_ESCAPED=r={}))},7399:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.evaluateKeyboardEvent=void 0;const s=i(2584),r={48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"']};t.evaluateKeyboardEvent=function(e,t,i,n){const o={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:"UIKeyInputUpArrow"===e.key?o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A":"UIKeyInputLeftArrow"===e.key?o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D":"UIKeyInputRightArrow"===e.key?o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C":"UIKeyInputDownArrow"===e.key&&(o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B");break;case 8:o.key=e.ctrlKey?"\b":s.C0.DEL,e.altKey&&(o.key=s.C0.ESC+o.key);break;case 9:if(e.shiftKey){o.key=s.C0.ESC+"[Z";break}o.key=s.C0.HT,o.cancel=!0;break;case 13:o.key=e.altKey?s.C0.ESC+s.C0.CR:s.C0.CR,o.cancel=!0;break;case 27:o.key=s.C0.ESC,e.altKey&&(o.key=s.C0.ESC+s.C0.ESC),o.cancel=!0;break;case 37:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"D",o.key===s.C0.ESC+"[1;3D"&&(o.key=s.C0.ESC+(i?"b":"[1;5D"))):o.key=t?s.C0.ESC+"OD":s.C0.ESC+"[D";break;case 39:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"C",o.key===s.C0.ESC+"[1;3C"&&(o.key=s.C0.ESC+(i?"f":"[1;5C"))):o.key=t?s.C0.ESC+"OC":s.C0.ESC+"[C";break;case 38:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"A",i||o.key!==s.C0.ESC+"[1;3A"||(o.key=s.C0.ESC+"[1;5A")):o.key=t?s.C0.ESC+"OA":s.C0.ESC+"[A";break;case 40:if(e.metaKey)break;a?(o.key=s.C0.ESC+"[1;"+(a+1)+"B",i||o.key!==s.C0.ESC+"[1;3B"||(o.key=s.C0.ESC+"[1;5B")):o.key=t?s.C0.ESC+"OB":s.C0.ESC+"[B";break;case 45:e.shiftKey||e.ctrlKey||(o.key=s.C0.ESC+"[2~");break;case 46:o.key=a?s.C0.ESC+"[3;"+(a+1)+"~":s.C0.ESC+"[3~";break;case 36:o.key=a?s.C0.ESC+"[1;"+(a+1)+"H":t?s.C0.ESC+"OH":s.C0.ESC+"[H";break;case 35:o.key=a?s.C0.ESC+"[1;"+(a+1)+"F":t?s.C0.ESC+"OF":s.C0.ESC+"[F";break;case 33:e.shiftKey?o.type=2:e.ctrlKey?o.key=s.C0.ESC+"[5;"+(a+1)+"~":o.key=s.C0.ESC+"[5~";break;case 34:e.shiftKey?o.type=3:e.ctrlKey?o.key=s.C0.ESC+"[6;"+(a+1)+"~":o.key=s.C0.ESC+"[6~";break;case 112:o.key=a?s.C0.ESC+"[1;"+(a+1)+"P":s.C0.ESC+"OP";break;case 113:o.key=a?s.C0.ESC+"[1;"+(a+1)+"Q":s.C0.ESC+"OQ";break;case 114:o.key=a?s.C0.ESC+"[1;"+(a+1)+"R":s.C0.ESC+"OR";break;case 115:o.key=a?s.C0.ESC+"[1;"+(a+1)+"S":s.C0.ESC+"OS";break;case 116:o.key=a?s.C0.ESC+"[15;"+(a+1)+"~":s.C0.ESC+"[15~";break;case 117:o.key=a?s.C0.ESC+"[17;"+(a+1)+"~":s.C0.ESC+"[17~";break;case 118:o.key=a?s.C0.ESC+"[18;"+(a+1)+"~":s.C0.ESC+"[18~";break;case 119:o.key=a?s.C0.ESC+"[19;"+(a+1)+"~":s.C0.ESC+"[19~";break;case 120:o.key=a?s.C0.ESC+"[20;"+(a+1)+"~":s.C0.ESC+"[20~";break;case 121:o.key=a?s.C0.ESC+"[21;"+(a+1)+"~":s.C0.ESC+"[21~";break;case 122:o.key=a?s.C0.ESC+"[23;"+(a+1)+"~":s.C0.ESC+"[23~";break;case 123:o.key=a?s.C0.ESC+"[24;"+(a+1)+"~":s.C0.ESC+"[24~";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(i&&!n||!e.altKey||e.metaKey)!i||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?o.key=e.key:e.key&&e.ctrlKey&&("_"===e.key&&(o.key=s.C0.US),"@"===e.key&&(o.key=s.C0.NUL)):65===e.keyCode&&(o.type=1);else{const t=r[e.keyCode],i=t?.[e.shiftKey?1:0];if(i)o.key=s.C0.ESC+i;else if(e.keyCode>=65&&e.keyCode<=90){const t=e.ctrlKey?e.keyCode-64:e.keyCode+32;let i=String.fromCharCode(t);e.shiftKey&&(i=i.toUpperCase()),o.key=s.C0.ESC+i}else if(32===e.keyCode)o.key=s.C0.ESC+(e.ctrlKey?s.C0.NUL:" ");else if("Dead"===e.key&&e.code.startsWith("Key")){let t=e.code.slice(3,4);e.shiftKey||(t=t.toLowerCase()),o.key=s.C0.ESC+t,o.cancel=!0}}else e.keyCode>=65&&e.keyCode<=90?o.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?o.key=s.C0.NUL:e.keyCode>=51&&e.keyCode<=55?o.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?o.key=s.C0.DEL:219===e.keyCode?o.key=s.C0.ESC:220===e.keyCode?o.key=s.C0.FS:221===e.keyCode&&(o.key=s.C0.GS)}return o}},482:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t=0,i=e.length){let s="";for(let r=t;r<i;++r){let t=e[r];t>65535?(t-=65536,s+=String.fromCharCode(55296+(t>>10))+String.fromCharCode(t%1024+56320)):s+=String.fromCharCode(t)}return s},t.StringToUtf32=class{constructor(){this._interim=0}clear(){this._interim=0}decode(e,t){const i=e.length;if(!i)return 0;let s=0,r=0;if(this._interim){const i=e.charCodeAt(r++);56320<=i&&i<=57343?t[s++]=1024*(this._interim-55296)+i-56320+65536:(t[s++]=this._interim,t[s++]=i),this._interim=0}for(let n=r;n<i;++n){const r=e.charCodeAt(n);if(55296<=r&&r<=56319){if(++n>=i)return this._interim=r,s;const o=e.charCodeAt(n);56320<=o&&o<=57343?t[s++]=1024*(r-55296)+o-56320+65536:(t[s++]=r,t[s++]=o)}else 65279!==r&&(t[s++]=r)}return s}},t.Utf8ToUtf32=class{constructor(){this.interim=new Uint8Array(3)}clear(){this.interim.fill(0)}decode(e,t){const i=e.length;if(!i)return 0;let s,r,n,o,a=0,h=0,c=0;if(this.interim[0]){let s=!1,r=this.interim[0];r&=192==(224&r)?31:224==(240&r)?15:7;let n,o=0;for(;(n=63&this.interim[++o])&&o<4;)r<<=6,r|=n;const h=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,l=h-o;for(;c<l;){if(c>=i)return 0;if(n=e[c++],128!=(192&n)){c--,s=!0;break}this.interim[o++]=n,r<<=6,r|=63&n}s||(2===h?r<128?c--:t[a++]=r:3===h?r<2048||r>=55296&&r<=57343||65279===r||(t[a++]=r):r<65536||r>1114111||(t[a++]=r)),this.interim.fill(0)}const l=i-4;let d=c;for(;d<i;){for(;!(!(d<l)||128&(s=e[d])||128&(r=e[d+1])||128&(n=e[d+2])||128&(o=e[d+3]));)t[a++]=s,t[a++]=r,t[a++]=n,t[a++]=o,d+=4;if(s=e[d++],s<128)t[a++]=s;else if(192==(224&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(h=(31&s)<<6|63&r,h<128){d--;continue}t[a++]=h}else if(224==(240&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(h=(15&s)<<12|(63&r)<<6|63&n,h<2048||h>=55296&&h<=57343||65279===h)continue;t[a++]=h}else if(240==(248&s)){if(d>=i)return this.interim[0]=s,a;if(r=e[d++],128!=(192&r)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,a;if(n=e[d++],128!=(192&n)){d--;continue}if(d>=i)return this.interim[0]=s,this.interim[1]=r,this.interim[2]=n,a;if(o=e[d++],128!=(192&o)){d--;continue}if(h=(7&s)<<18|(63&r)<<12|(63&n)<<6|63&o,h<65536||h>1114111)continue;t[a++]=h}}return a}}},225:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const s=i(1480),r=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],n=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let o;t.UnicodeV6=class{constructor(){if(this.version="6",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;e<r.length;++e)o.fill(0,r[e][0],r[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?o[e]:function(e,t){let i,s=0,r=t.length-1;if(e<t[0][0]||e>t[r][1])return!1;for(;r>=s;)if(i=s+r>>1,e>t[i][1])s=i+1;else{if(!(e<t[i][0]))return!0;r=i-1}return!1}(e,n)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),r=0===i&&0!==t;if(r){const e=s.UnicodeService.extractWidth(t);0===e?r=!1:e>i&&(i=e)}return s.UnicodeService.createPropertyValue(0,i,r)}}},5981:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.WriteBuffer=void 0;const s=i(8460),r=i(844);class n extends r.Disposable{constructor(e){super(),this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0,this._didUserInput=!1,this._onWriteParsed=this.register(new s.EventEmitter),this.onWriteParsed=this._onWriteParsed.event}handleUserInput(){this._didUserInput=!0}writeSync(e,t){if(void 0!==t&&this._syncCalls>t)return void(this._syncCalls=0);if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,this._isSyncWriting)return;let i;for(this._isSyncWriting=!0;i=this._writeBuffer.shift();){this._action(i);const e=this._callbacks.shift();e&&e()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}write(e,t){if(this._pendingData>5e7)throw new Error("write data discarded, use flow control to avoid losing data");if(!this._writeBuffer.length){if(this._bufferOffset=0,this._didUserInput)return this._didUserInput=!1,this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t),void this._innerWrite();setTimeout((()=>this._innerWrite()))}this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)}_innerWrite(e=0,t=!0){const i=e||Date.now();for(;this._writeBuffer.length>this._bufferOffset;){const e=this._writeBuffer[this._bufferOffset],s=this._action(e,t);if(s){const e=e=>Date.now()-i>=12?setTimeout((()=>this._innerWrite(0,e))):this._innerWrite(i,e);return void s.catch((e=>(queueMicrotask((()=>{throw e})),Promise.resolve(!1)))).then(e)}const r=this._callbacks[this._bufferOffset];if(r&&r(),this._bufferOffset++,this._pendingData-=e.length,Date.now()-i>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((()=>this._innerWrite()))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0),this._onWriteParsed.fire()}}t.WriteBuffer=n},5941:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.toRgbString=t.parseColor=void 0;const i=/^([\da-f])\/([\da-f])\/([\da-f])$|^([\da-f]{2})\/([\da-f]{2})\/([\da-f]{2})$|^([\da-f]{3})\/([\da-f]{3})\/([\da-f]{3})$|^([\da-f]{4})\/([\da-f]{4})\/([\da-f]{4})$/,s=/^[\da-f]+$/;function r(e,t){const i=e.toString(16),s=i.length<2?"0"+i:i;switch(t){case 4:return i[0];case 8:return s;case 12:return(s+s).slice(0,3);default:return s+s}}t.parseColor=function(e){if(!e)return;let t=e.toLowerCase();if(0===t.indexOf("rgb:")){t=t.slice(4);const e=i.exec(t);if(e){const t=e[1]?15:e[4]?255:e[7]?4095:65535;return[Math.round(parseInt(e[1]||e[4]||e[7]||e[10],16)/t*255),Math.round(parseInt(e[2]||e[5]||e[8]||e[11],16)/t*255),Math.round(parseInt(e[3]||e[6]||e[9]||e[12],16)/t*255)]}}else if(0===t.indexOf("#")&&(t=t.slice(1),s.exec(t)&&[3,6,9,12].includes(t.length))){const e=t.length/3,i=[0,0,0];for(let s=0;s<3;++s){const r=parseInt(t.slice(e*s,e*s+e),16);i[s]=1===e?r<<4:2===e?r:3===e?r>>4:r>>8}return i}},t.toRgbString=function(e,t=16){const[i,s,n]=e;return`rgb:${r(i,t)}/${r(s,t)}/${r(n,t)}`}},5770:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DcsHandler=t.DcsParser=void 0;const s=i(482),r=i(8742),n=i(5770),o=[];t.DcsParser=class{constructor(){this._handlers=Object.create(null),this._active=o,this._ident=0,this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=o}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}reset(){if(this._active.length)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=o,this._ident=0}hook(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||o,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].hook(t);else this._handlerFb(this._ident,"HOOK",t)}put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._ident,"PUT",(0,s.utf32ToString)(e,t,i))}unhook(e,t=!0){if(this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].unhook(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].unhook(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._ident,"UNHOOK",e);this._active=o,this._ident=0}};const a=new r.Params;a.addParam(0),t.DcsHandler=class{constructor(e){this._handler=e,this._data="",this._params=a,this._hitLimit=!1}hook(e){this._params=e.length>1||e.params[0]?e.clone():a,this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,s.utf32ToString)(e,t,i),this._data.length>n.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}unhook(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data,this._params),t instanceof Promise))return t.then((e=>(this._params=a,this._data="",this._hitLimit=!1,e)));return this._params=a,this._data="",this._hitLimit=!1,t}}},2015:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;const s=i(844),r=i(8742),n=i(6242),o=i(6351);class a{constructor(e){this.table=new Uint8Array(e)}setDefault(e,t){this.table.fill(e<<4|t)}add(e,t,i,s){this.table[t<<8|e]=i<<4|s}addMany(e,t,i,s){for(let r=0;r<e.length;r++)this.table[t<<8|e[r]]=i<<4|s}}t.TransitionTable=a;const h=160;t.VT500_TRANSITION_TABLE=function(){const e=new a(4095),t=Array.apply(null,Array(256)).map(((e,t)=>t)),i=(e,i)=>t.slice(e,i),s=i(32,127),r=i(0,24);r.push(25),r.push.apply(r,i(28,32));const n=i(0,14);let o;for(o in e.setDefault(1,0),e.addMany(s,0,2,0),n)e.addMany([24,26,153,154],o,3,0),e.addMany(i(128,144),o,3,0),e.addMany(i(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(r,0,3,0),e.addMany(r,1,3,1),e.add(127,1,0,1),e.addMany(r,8,0,8),e.addMany(r,3,3,3),e.add(127,3,0,3),e.addMany(r,4,3,4),e.add(127,4,0,4),e.addMany(r,6,3,6),e.addMany(r,5,3,5),e.add(127,5,0,5),e.addMany(r,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(s,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(i(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(s,7,0,7),e.addMany(r,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(i(64,127),3,7,0),e.addMany(i(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(i(48,60),4,8,4),e.addMany(i(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(i(32,64),6,0,6),e.add(127,6,0,6),e.addMany(i(64,127),6,0,0),e.addMany(i(32,48),3,9,5),e.addMany(i(32,48),5,9,5),e.addMany(i(48,64),5,0,6),e.addMany(i(64,127),5,7,0),e.addMany(i(32,48),4,9,5),e.addMany(i(32,48),1,9,2),e.addMany(i(32,48),2,9,2),e.addMany(i(48,127),2,10,0),e.addMany(i(48,80),1,10,0),e.addMany(i(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(i(96,127),1,10,0),e.add(80,1,11,9),e.addMany(r,9,0,9),e.add(127,9,0,9),e.addMany(i(28,32),9,0,9),e.addMany(i(32,48),9,9,12),e.addMany(i(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(r,11,0,11),e.addMany(i(32,128),11,0,11),e.addMany(i(28,32),11,0,11),e.addMany(r,10,0,10),e.add(127,10,0,10),e.addMany(i(28,32),10,0,10),e.addMany(i(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(i(32,48),10,9,12),e.addMany(r,12,0,12),e.add(127,12,0,12),e.addMany(i(28,32),12,0,12),e.addMany(i(32,48),12,9,12),e.addMany(i(48,64),12,0,11),e.addMany(i(64,127),12,12,13),e.addMany(i(64,127),10,12,13),e.addMany(i(64,127),9,12,13),e.addMany(r,13,13,13),e.addMany(s,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(h,0,2,0),e.add(h,8,5,8),e.add(h,6,0,6),e.add(h,11,0,11),e.add(h,13,13,13),e}();class c extends s.Disposable{constructor(e=t.VT500_TRANSITION_TABLE){super(),this._transitions=e,this._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},this.initialState=0,this.currentState=this.initialState,this._params=new r.Params,this._params.addParam(0),this._collect=0,this.precedingJoinState=0,this._printHandlerFb=(e,t,i)=>{},this._executeHandlerFb=e=>{},this._csiHandlerFb=(e,t)=>{},this._escHandlerFb=e=>{},this._errorHandlerFb=e=>e,this._printHandler=this._printHandlerFb,this._executeHandlers=Object.create(null),this._csiHandlers=Object.create(null),this._escHandlers=Object.create(null),this.register((0,s.toDisposable)((()=>{this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null)}))),this._oscParser=this.register(new n.OscParser),this._dcsParser=this.register(new o.DcsParser),this._errorHandler=this._errorHandlerFb,this.registerEscHandler({final:"\\"},(()=>!0))}_identifier(e,t=[64,126]){let i=0;if(e.prefix){if(e.prefix.length>1)throw new Error("only one byte as prefix supported");if(i=e.prefix.charCodeAt(0),i&&60>i||i>63)throw new Error("prefix must be in range 0x3c .. 0x3f")}if(e.intermediates){if(e.intermediates.length>2)throw new Error("only two bytes as intermediates are supported");for(let t=0;t<e.intermediates.length;++t){const s=e.intermediates.charCodeAt(t);if(32>s||s>47)throw new Error("intermediate must be in range 0x20 .. 0x2f");i<<=8,i|=s}}if(1!==e.final.length)throw new Error("final must be a single byte");const s=e.final.charCodeAt(0);if(t[0]>s||s>t[1])throw new Error(`final must be in range ${t[0]} .. ${t[1]}`);return i<<=8,i|=s,i}identToString(e){const t=[];for(;e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join("")}setPrintHandler(e){this._printHandler=e}clearPrintHandler(){this._printHandler=this._printHandlerFb}registerEscHandler(e,t){const i=this._identifier(e,[48,126]);void 0===this._escHandlers[i]&&(this._escHandlers[i]=[]);const s=this._escHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearEscHandler(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]}setEscHandlerFallback(e){this._escHandlerFb=e}setExecuteHandler(e,t){this._executeHandlers[e.charCodeAt(0)]=t}clearExecuteHandler(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]}setExecuteHandlerFallback(e){this._executeHandlerFb=e}registerCsiHandler(e,t){const i=this._identifier(e);void 0===this._csiHandlers[i]&&(this._csiHandlers[i]=[]);const s=this._csiHandlers[i];return s.push(t),{dispose:()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}}clearCsiHandler(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]}setCsiHandlerFallback(e){this._csiHandlerFb=e}registerDcsHandler(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)}clearDcsHandler(e){this._dcsParser.clearHandler(this._identifier(e))}setDcsHandlerFallback(e){this._dcsParser.setHandlerFallback(e)}registerOscHandler(e,t){return this._oscParser.registerHandler(e,t)}clearOscHandler(e){this._oscParser.clearHandler(e)}setOscHandlerFallback(e){this._oscParser.setHandlerFallback(e)}setErrorHandler(e){this._errorHandler=e}clearErrorHandler(){this._errorHandler=this._errorHandlerFb}reset(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])}_preserveStack(e,t,i,s,r){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=i,this._parseStack.transition=s,this._parseStack.chunkPos=r}parse(e,t,i){let s,r=0,n=0,o=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,o=this._parseStack.chunkPos+1;else{if(void 0===i||1===this._parseStack.state)throw this._parseStack.state=1,new Error("improper continuation due to previous async handler, giving up parsing");const t=this._parseStack.handlers;let n=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](this._params),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 4:if(!1===i&&n>-1)for(;n>=0&&(s=t[n](),!0!==s);n--)if(s instanceof Promise)return this._parseStack.handlerPos=n,s;this._parseStack.handlers=[];break;case 6:if(r=e[this._parseStack.chunkPos],s=this._dcsParser.unhook(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(r=e[this._parseStack.chunkPos],s=this._oscParser.end(24!==r&&26!==r,i),s)return s;27===r&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,o=this._parseStack.chunkPos+1,this.precedingJoinState=0,this.currentState=15&this._parseStack.transition}for(let i=o;i<t;++i){switch(r=e[i],n=this._transitions.table[this.currentState<<8|(r<160?r:h)],n>>4){case 2:for(let s=i+1;;++s){if(s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}if(++s>=t||(r=e[s])<32||r>126&&r<h){this._printHandler(e,i,s),i=s-1;break}}break;case 3:this._executeHandlers[r]?this._executeHandlers[r]():this._executeHandlerFb(r),this.precedingJoinState=0;break;case 0:break;case 1:if(this._errorHandler({position:i,code:r,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:const o=this._csiHandlers[this._collect<<8|r];let a=o?o.length-1:-1;for(;a>=0&&(s=o[a](this._params),!0!==s);a--)if(s instanceof Promise)return this._preserveStack(3,o,a,n,i),s;a<0&&this._csiHandlerFb(this._collect<<8|r,this._params),this.precedingJoinState=0;break;case 8:do{switch(r){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(r-48)}}while(++i<t&&(r=e[i])>47&&r<60);i--;break;case 9:this._collect<<=8,this._collect|=r;break;case 10:const c=this._escHandlers[this._collect<<8|r];let l=c?c.length-1:-1;for(;l>=0&&(s=c[l](),!0!==s);l--)if(s instanceof Promise)return this._preserveStack(4,c,l,n,i),s;l<0&&this._escHandlerFb(this._collect<<8|r),this.precedingJoinState=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|r,this._params);break;case 13:for(let s=i+1;;++s)if(s>=t||24===(r=e[s])||26===r||27===r||r>127&&r<h){this._dcsParser.put(e,i,s),i=s-1;break}break;case 14:if(s=this._dcsParser.unhook(24!==r&&26!==r),s)return this._preserveStack(6,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0;break;case 4:this._oscParser.start();break;case 5:for(let s=i+1;;s++)if(s>=t||(r=e[s])<32||r>127&&r<h){this._oscParser.put(e,i,s),i=s-1;break}break;case 6:if(s=this._oscParser.end(24!==r&&26!==r),s)return this._preserveStack(5,[],0,n,i),s;27===r&&(n|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingJoinState=0}this.currentState=15&n}}}t.EscapeSequenceParser=c},6242:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OscHandler=t.OscParser=void 0;const s=i(5770),r=i(482),n=[];t.OscParser=class{constructor(){this._state=0,this._active=n,this._id=-1,this._handlers=Object.create(null),this._handlerFb=()=>{},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}registerHandler(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);const i=this._handlers[e];return i.push(t),{dispose:()=>{const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}}clearHandler(e){this._handlers[e]&&delete this._handlers[e]}setHandlerFallback(e){this._handlerFb=e}dispose(){this._handlers=Object.create(null),this._handlerFb=()=>{},this._active=n}reset(){if(2===this._state)for(let e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=n,this._id=-1,this._state=0}_start(){if(this._active=this._handlers[this._id]||n,this._active.length)for(let e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,"START")}_put(e,t,i){if(this._active.length)for(let s=this._active.length-1;s>=0;s--)this._active[s].put(e,t,i);else this._handlerFb(this._id,"PUT",(0,r.utf32ToString)(e,t,i))}start(){this.reset(),this._state=1}put(e,t,i){if(3!==this._state){if(1===this._state)for(;t<i;){const i=e[t++];if(59===i){this._state=2,this._start();break}if(i<48||57<i)return void(this._state=3);-1===this._id&&(this._id=0),this._id=10*this._id+i-48}2===this._state&&i-t>0&&this._put(e,t,i)}}end(e,t=!0){if(0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){let i=!1,s=this._active.length-1,r=!1;if(this._stack.paused&&(s=this._stack.loopPosition-1,i=t,r=this._stack.fallThrough,this._stack.paused=!1),!r&&!1===i){for(;s>=0&&(i=this._active[s].end(e),!0!==i);s--)if(i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!1,i;s--}for(;s>=0;s--)if(i=this._active[s].end(!1),i instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=s,this._stack.fallThrough=!0,i}else this._handlerFb(this._id,"END",e);this._active=n,this._id=-1,this._state=0}}},t.OscHandler=class{constructor(e){this._handler=e,this._data="",this._hitLimit=!1}start(){this._data="",this._hitLimit=!1}put(e,t,i){this._hitLimit||(this._data+=(0,r.utf32ToString)(e,t,i),this._data.length>s.PAYLOAD_LIMIT&&(this._data="",this._hitLimit=!0))}end(e){let t=!1;if(this._hitLimit)t=!1;else if(e&&(t=this._handler(this._data),t instanceof Promise))return t.then((e=>(this._data="",this._hitLimit=!1,e)));return this._data="",this._hitLimit=!1,t}}},8742:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Params=void 0;const i=2147483647;class s{static fromArray(e){const t=new s;if(!e.length)return t;for(let i=Array.isArray(e[0])?1:0;i<e.length;++i){const s=e[i];if(Array.isArray(s))for(let e=0;e<s.length;++e)t.addSubParam(s[e]);else t.addParam(s)}return t}constructor(e=32,t=32){if(this.maxLength=e,this.maxSubParamsLength=t,t>256)throw new Error("maxSubParamsLength must not be greater than 256");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}clone(){const e=new s(this.maxLength,this.maxSubParamsLength);return e.params.set(this.params),e.length=this.length,e._subParams.set(this._subParams),e._subParamsLength=this._subParamsLength,e._subParamsIdx.set(this._subParamsIdx),e._rejectDigits=this._rejectDigits,e._rejectSubDigits=this._rejectSubDigits,e._digitIsSub=this._digitIsSub,e}toArray(){const e=[];for(let t=0;t<this.length;++t){e.push(this.params[t]);const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&e.push(Array.prototype.slice.call(this._subParams,i,s))}return e}reset(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}addParam(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>i?i:e}}addSubParam(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error("values lesser than -1 are not allowed");this._subParams[this._subParamsLength++]=e>i?i:e,this._subParamsIdx[this.length-1]++}}hasSubParams(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0}getSubParams(e){const t=this._subParamsIdx[e]>>8,i=255&this._subParamsIdx[e];return i-t>0?this._subParams.subarray(t,i):null}getSubParamsAll(){const e={};for(let t=0;t<this.length;++t){const i=this._subParamsIdx[t]>>8,s=255&this._subParamsIdx[t];s-i>0&&(e[t]=this._subParams.slice(i,s))}return e}addDigit(e){let t;if(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)return;const s=this._digitIsSub?this._subParams:this.params,r=s[t-1];s[t-1]=~r?Math.min(10*r+e,i):e}}t.Params=s},5741:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.AddonManager=void 0,t.AddonManager=class{constructor(){this._addons=[]}dispose(){for(let e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()}loadAddon(e,t){const i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=()=>this._wrappedAddonDispose(i),t.activate(e)}_wrappedAddonDispose(e){if(e.isDisposed)return;let t=-1;for(let i=0;i<this._addons.length;i++)if(this._addons[i]===e){t=i;break}if(-1===t)throw new Error("Could not dispose an addon that has not been loaded");e.isDisposed=!0,e.dispose.apply(e.instance),this._addons.splice(t,1)}}},8771:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferApiView=void 0;const s=i(3785),r=i(511);t.BufferApiView=class{constructor(e,t){this._buffer=e,this.type=t}init(e){return this._buffer=e,this}get cursorY(){return this._buffer.y}get cursorX(){return this._buffer.x}get viewportY(){return this._buffer.ydisp}get baseY(){return this._buffer.ybase}get length(){return this._buffer.lines.length}getLine(e){const t=this._buffer.lines.get(e);if(t)return new s.BufferLineApiView(t)}getNullCell(){return new r.CellData}}},3785:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferLineApiView=void 0;const s=i(511);t.BufferLineApiView=class{constructor(e){this._line=e}get isWrapped(){return this._line.isWrapped}get length(){return this._line.length}getCell(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new s.CellData)}translateToString(e,t,i){return this._line.translateToString(e,t,i)}}},8285:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.BufferNamespaceApi=void 0;const s=i(8771),r=i(8460),n=i(844);class o extends n.Disposable{constructor(e){super(),this._core=e,this._onBufferChange=this.register(new r.EventEmitter),this.onBufferChange=this._onBufferChange.event,this._normal=new s.BufferApiView(this._core.buffers.normal,"normal"),this._alternate=new s.BufferApiView(this._core.buffers.alt,"alternate"),this._core.buffers.onBufferActivate((()=>this._onBufferChange.fire(this.active)))}get active(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error("Active buffer is neither normal nor alternate")}get normal(){return this._normal.init(this._core.buffers.normal)}get alternate(){return this._alternate.init(this._core.buffers.alt)}}t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.ParserApi=void 0,t.ParserApi=class{constructor(e){this._core=e}registerCsiHandler(e,t){return this._core.registerCsiHandler(e,(e=>t(e.toArray())))}addCsiHandler(e,t){return this.registerCsiHandler(e,t)}registerDcsHandler(e,t){return this._core.registerDcsHandler(e,((e,i)=>t(e,i.toArray())))}addDcsHandler(e,t){return this.registerDcsHandler(e,t)}registerEscHandler(e,t){return this._core.registerEscHandler(e,t)}addEscHandler(e,t){return this.registerEscHandler(e,t)}registerOscHandler(e,t){return this._core.registerOscHandler(e,t)}addOscHandler(e,t){return this.registerOscHandler(e,t)}}},7090:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeApi=void 0,t.UnicodeApi=class{constructor(e){this._core=e}register(e){this._core.unicodeService.register(e)}get versions(){return this._core.unicodeService.versions}get activeVersion(){return this._core.unicodeService.activeVersion}set activeVersion(e){this._core.unicodeService.activeVersion=e}}},744:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;const n=i(8460),o=i(844),a=i(5295),h=i(2585);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;let c=t.BufferService=class extends o.Disposable{get buffer(){return this.buffers.active}constructor(e){super(),this.isUserScrolling=!1,this._onResize=this.register(new n.EventEmitter),this.onResize=this._onResize.event,this._onScroll=this.register(new n.EventEmitter),this.onScroll=this._onScroll.event,this.cols=Math.max(e.rawOptions.cols||0,t.MINIMUM_COLS),this.rows=Math.max(e.rawOptions.rows||0,t.MINIMUM_ROWS),this.buffers=this.register(new a.BufferSet(e,this))}resize(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this._onResize.fire({cols:e,rows:t})}reset(){this.buffers.reset(),this.isUserScrolling=!1}scroll(e,t=!1){const i=this.buffer;let s;s=this._cachedBlankLine,s&&s.length===this.cols&&s.getFg(0)===e.fg&&s.getBg(0)===e.bg||(s=i.getBlankLine(e,t),this._cachedBlankLine=s),s.isWrapped=t;const r=i.ybase+i.scrollTop,n=i.ybase+i.scrollBottom;if(0===i.scrollTop){const e=i.lines.isFull;n===i.lines.length-1?e?i.lines.recycle().copyFrom(s):i.lines.push(s.clone()):i.lines.splice(n+1,0,s.clone()),e?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{const e=n-r+1;i.lines.shiftElements(r+1,e-1,-1),i.lines.set(n,s.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)}scrollLines(e,t,i){const s=this.buffer;if(e<0){if(0===s.ydisp)return;this.isUserScrolling=!0}else e+s.ydisp>=s.ybase&&(this.isUserScrolling=!1);const r=s.ydisp;s.ydisp=Math.max(Math.min(s.ydisp+e,s.ybase),0),r!==s.ydisp&&(t||this._onScroll.fire(s.ydisp))}};t.BufferService=c=s([r(0,h.IOptionsService)],c)},7994:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.CharsetService=void 0,t.CharsetService=class{constructor(){this.glevel=0,this._charsets=[]}reset(){this.charset=void 0,this._charsets=[],this.glevel=0}setgLevel(e){this.glevel=e,this.charset=this._charsets[e]}setgCharset(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)}}},1753:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreMouseService=void 0;const n=i(2585),o=i(8460),a=i(844),h={NONE:{events:0,restrict:()=>!1},X10:{events:1,restrict:e=>4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)},VT200:{events:19,restrict:e=>32!==e.action},DRAG:{events:23,restrict:e=>32!==e.action||3!==e.button},ANY:{events:31,restrict:e=>!0}};function c(e,t){let i=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(i|=64,i|=e.action):(i|=3&e.button,4&e.button&&(i|=64),8&e.button&&(i|=128),32===e.action?i|=32:0!==e.action||t||(i|=3)),i}const l=String.fromCharCode,d={DEFAULT:e=>{const t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?"":`[M${l(t[0])}${l(t[1])}${l(t[2])}`},SGR:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.col};${e.row}${t}`},SGR_PIXELS:e=>{const t=0===e.action&&4!==e.button?"m":"M";return`[<${c(e,!0)};${e.x};${e.y}${t}`}};let _=t.CoreMouseService=class extends a.Disposable{constructor(e,t){super(),this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol="",this._activeEncoding="",this._lastEvent=null,this._onProtocolChange=this.register(new o.EventEmitter),this.onProtocolChange=this._onProtocolChange.event;for(const e of Object.keys(h))this.addProtocol(e,h[e]);for(const e of Object.keys(d))this.addEncoding(e,d[e]);this.reset()}addProtocol(e,t){this._protocols[e]=t}addEncoding(e,t){this._encodings[e]=t}get activeProtocol(){return this._activeProtocol}get areMouseEventsActive(){return 0!==this._protocols[this._activeProtocol].events}set activeProtocol(e){if(!this._protocols[e])throw new Error(`unknown protocol "${e}"`);this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)}get activeEncoding(){return this._activeEncoding}set activeEncoding(e){if(!this._encodings[e])throw new Error(`unknown encoding "${e}"`);this._activeEncoding=e}reset(){this.activeProtocol="NONE",this.activeEncoding="DEFAULT",this._lastEvent=null}triggerMouseEvent(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._equalEvents(this._lastEvent,e,"SGR_PIXELS"===this._activeEncoding))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;const t=this._encodings[this._activeEncoding](e);return t&&("DEFAULT"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0}explainEvents(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}}_equalEvents(e,t,i){if(i){if(e.x!==t.x)return!1;if(e.y!==t.y)return!1}else{if(e.col!==t.col)return!1;if(e.row!==t.row)return!1}return e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift}};t.CoreMouseService=_=s([r(0,n.IBufferService),r(1,n.ICoreService)],_)},6975:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.CoreService=void 0;const n=i(1439),o=i(8460),a=i(844),h=i(2585),c=Object.freeze({insertMode:!1}),l=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0});let d=t.CoreService=class extends a.Disposable{constructor(e,t,i){super(),this._bufferService=e,this._logService=t,this._optionsService=i,this.isCursorInitialized=!1,this.isCursorHidden=!1,this._onData=this.register(new o.EventEmitter),this.onData=this._onData.event,this._onUserInput=this.register(new o.EventEmitter),this.onUserInput=this._onUserInput.event,this._onBinary=this.register(new o.EventEmitter),this.onBinary=this._onBinary.event,this._onRequestScrollToBottom=this.register(new o.EventEmitter),this.onRequestScrollToBottom=this._onRequestScrollToBottom.event,this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}reset(){this.modes=(0,n.clone)(c),this.decPrivateModes=(0,n.clone)(l)}triggerDataEvent(e,t=!1){if(this._optionsService.rawOptions.disableStdin)return;const i=this._bufferService.buffer;t&&this._optionsService.rawOptions.scrollOnUserInput&&i.ybase!==i.ydisp&&this._onRequestScrollToBottom.fire(),t&&this._onUserInput.fire(),this._logService.debug(`sending data "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onData.fire(e)}triggerBinaryEvent(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug(`sending binary "${e}"`,(()=>e.split("").map((e=>e.charCodeAt(0))))),this._onBinary.fire(e))}};t.CoreService=d=s([r(0,h.IBufferService),r(1,h.ILogService),r(2,h.IOptionsService)],d)},9074:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.DecorationService=void 0;const s=i(8055),r=i(8460),n=i(844),o=i(6106);let a=0,h=0;class c extends n.Disposable{get decorations(){return this._decorations.values()}constructor(){super(),this._decorations=new o.SortedList((e=>e?.marker.line)),this._onDecorationRegistered=this.register(new r.EventEmitter),this.onDecorationRegistered=this._onDecorationRegistered.event,this._onDecorationRemoved=this.register(new r.EventEmitter),this.onDecorationRemoved=this._onDecorationRemoved.event,this.register((0,n.toDisposable)((()=>this.reset())))}registerDecoration(e){if(e.marker.isDisposed)return;const t=new l(e);if(t){const e=t.marker.onDispose((()=>t.dispose()));t.onDispose((()=>{t&&(this._decorations.delete(t)&&this._onDecorationRemoved.fire(t),e.dispose())})),this._decorations.insert(t),this._onDecorationRegistered.fire(t)}return t}reset(){for(const e of this._decorations.values())e.dispose();this._decorations.clear()}*getDecorationsAtCell(e,t,i){let s=0,r=0;for(const n of this._decorations.getKeyIterator(t))s=n.options.x??0,r=s+(n.options.width??1),e>=s&&e<r&&(!i||(n.options.layer??"bottom")===i)&&(yield n)}forEachDecorationAtCell(e,t,i,s){this._decorations.forEachByKey(t,(t=>{a=t.options.x??0,h=a+(t.options.width??1),e>=a&&e<h&&(!i||(t.options.layer??"bottom")===i)&&s(t)}))}}t.DecorationService=c;class l extends n.Disposable{get isDisposed(){return this._isDisposed}get backgroundColorRGB(){return null===this._cachedBg&&(this.options.backgroundColor?this._cachedBg=s.css.toColor(this.options.backgroundColor):this._cachedBg=void 0),this._cachedBg}get foregroundColorRGB(){return null===this._cachedFg&&(this.options.foregroundColor?this._cachedFg=s.css.toColor(this.options.foregroundColor):this._cachedFg=void 0),this._cachedFg}constructor(e){super(),this.options=e,this.onRenderEmitter=this.register(new r.EventEmitter),this.onRender=this.onRenderEmitter.event,this._onDispose=this.register(new r.EventEmitter),this.onDispose=this._onDispose.event,this._cachedBg=null,this._cachedFg=null,this.marker=e.marker,this.options.overviewRulerOptions&&!this.options.overviewRulerOptions.position&&(this.options.overviewRulerOptions.position="full")}dispose(){this._onDispose.fire(),super.dispose()}}},4348:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;const s=i(2585),r=i(8343);class n{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}forEach(e){for(const[t,i]of this._entries.entries())e(t,i)}has(e){return this._entries.has(e)}get(e){return this._entries.get(e)}}t.ServiceCollection=n,t.InstantiationService=class{constructor(){this._services=new n,this._services.set(s.IInstantiationService,this)}setService(e,t){this._services.set(e,t)}getService(e){return this._services.get(e)}createInstance(e,...t){const i=(0,r.getServiceDependencies)(e).sort(((e,t)=>e.index-t.index)),s=[];for(const t of i){const i=this._services.get(t.id);if(!i)throw new Error(`[createInstance] ${e.name} depends on UNKNOWN service ${t.id}.`);s.push(i)}const n=i.length>0?i[0].index:t.length;if(t.length!==n)throw new Error(`[createInstance] First service dependency of ${e.name} at position ${n+1} conflicts with ${t.length} static arguments`);return new e(...[...t,...s])}}},7866:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.traceCall=t.setTraceLogger=t.LogService=void 0;const n=i(844),o=i(2585),a={trace:o.LogLevelEnum.TRACE,debug:o.LogLevelEnum.DEBUG,info:o.LogLevelEnum.INFO,warn:o.LogLevelEnum.WARN,error:o.LogLevelEnum.ERROR,off:o.LogLevelEnum.OFF};let h,c=t.LogService=class extends n.Disposable{get logLevel(){return this._logLevel}constructor(e){super(),this._optionsService=e,this._logLevel=o.LogLevelEnum.OFF,this._updateLogLevel(),this.register(this._optionsService.onSpecificOptionChange("logLevel",(()=>this._updateLogLevel()))),h=this}_updateLogLevel(){this._logLevel=a[this._optionsService.rawOptions.logLevel]}_evalLazyOptionalParams(e){for(let t=0;t<e.length;t++)"function"==typeof e[t]&&(e[t]=e[t]())}_log(e,t,i){this._evalLazyOptionalParams(i),e.call(console,(this._optionsService.options.logger?"":"xterm.js: ")+t,...i)}trace(e,...t){this._logLevel<=o.LogLevelEnum.TRACE&&this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger)??console.log,e,t)}debug(e,...t){this._logLevel<=o.LogLevelEnum.DEBUG&&this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger)??console.log,e,t)}info(e,...t){this._logLevel<=o.LogLevelEnum.INFO&&this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger)??console.info,e,t)}warn(e,...t){this._logLevel<=o.LogLevelEnum.WARN&&this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger)??console.warn,e,t)}error(e,...t){this._logLevel<=o.LogLevelEnum.ERROR&&this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger)??console.error,e,t)}};t.LogService=c=s([r(0,o.IOptionsService)],c),t.setTraceLogger=function(e){h=e},t.traceCall=function(e,t,i){if("function"!=typeof i.value)throw new Error("not supported");const s=i.value;i.value=function(...e){if(h.logLevel!==o.LogLevelEnum.TRACE)return s.apply(this,e);h.trace(`GlyphRenderer#${s.name}(${e.map((e=>JSON.stringify(e))).join(", ")})`);const t=s.apply(this,e);return h.trace(`GlyphRenderer#${s.name} return`,t),t}}},7302:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=void 0;const s=i(8460),r=i(844),n=i(6114);t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:"block",cursorWidth:1,cursorInactiveStyle:"outline",customGlyphs:!0,drawBoldTextInBrightColors:!0,documentOverride:null,fastScrollModifier:"alt",fastScrollSensitivity:5,fontFamily:"courier-new, courier, monospace",fontSize:15,fontWeight:"normal",fontWeightBold:"bold",ignoreBracketedPasteMode:!1,lineHeight:1,letterSpacing:0,linkHandler:null,logLevel:"info",logger:null,scrollback:1e3,scrollOnUserInput:!0,scrollSensitivity:1,screenReaderMode:!1,smoothScrollDuration:0,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!1,allowTransparency:!1,tabStopWidth:8,theme:{},rescaleOverlappingGlyphs:!1,rightClickSelectsWord:n.isMac,windowOptions:{},windowsMode:!1,windowsPty:{},wordSeparator:" ()[]{}',\"`",altClickMovesCursor:!0,convertEol:!1,termName:"xterm",cancelEvents:!1,overviewRulerWidth:0};const o=["normal","bold","100","200","300","400","500","600","700","800","900"];class a extends r.Disposable{constructor(e){super(),this._onOptionChange=this.register(new s.EventEmitter),this.onOptionChange=this._onOptionChange.event;const i={...t.DEFAULT_OPTIONS};for(const t in e)if(t in i)try{const s=e[t];i[t]=this._sanitizeAndValidateOption(t,s)}catch(e){console.error(e)}this.rawOptions=i,this.options={...i},this._setupOptions(),this.register((0,r.toDisposable)((()=>{this.rawOptions.linkHandler=null,this.rawOptions.documentOverride=null})))}onSpecificOptionChange(e,t){return this.onOptionChange((i=>{i===e&&t(this.rawOptions[e])}))}onMultipleOptionChange(e,t){return this.onOptionChange((i=>{-1!==e.indexOf(i)&&t()}))}_setupOptions(){const e=e=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);return this.rawOptions[e]},i=(e,i)=>{if(!(e in t.DEFAULT_OPTIONS))throw new Error(`No option with key "${e}"`);i=this._sanitizeAndValidateOption(e,i),this.rawOptions[e]!==i&&(this.rawOptions[e]=i,this._onOptionChange.fire(e))};for(const t in this.rawOptions){const s={get:e.bind(this,t),set:i.bind(this,t)};Object.defineProperty(this.options,t,s)}}_sanitizeAndValidateOption(e,i){switch(e){case"cursorStyle":if(i||(i=t.DEFAULT_OPTIONS[e]),!function(e){return"block"===e||"underline"===e||"bar"===e}(i))throw new Error(`"${i}" is not a valid value for ${e}`);break;case"wordSeparator":i||(i=t.DEFAULT_OPTIONS[e]);break;case"fontWeight":case"fontWeightBold":if("number"==typeof i&&1<=i&&i<=1e3)break;i=o.includes(i)?i:t.DEFAULT_OPTIONS[e];break;case"cursorWidth":i=Math.floor(i);case"lineHeight":case"tabStopWidth":if(i<1)throw new Error(`${e} cannot be less than 1, value: ${i}`);break;case"minimumContrastRatio":i=Math.max(1,Math.min(21,Math.round(10*i)/10));break;case"scrollback":if((i=Math.min(i,4294967295))<0)throw new Error(`${e} cannot be less than 0, value: ${i}`);break;case"fastScrollSensitivity":case"scrollSensitivity":if(i<=0)throw new Error(`${e} cannot be less than or equal to 0, value: ${i}`);break;case"rows":case"cols":if(!i&&0!==i)throw new Error(`${e} must be numeric, value: ${i}`);break;case"windowsPty":i=i??{}}return i}}t.OptionsService=a},2660:function(e,t,i){var s=this&&this.__decorate||function(e,t,i,s){var r,n=arguments.length,o=n<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,s);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(n<3?r(o):n>3?r(t,i,o):r(t,i))||o);return n>3&&o&&Object.defineProperty(t,i,o),o},r=this&&this.__param||function(e,t){return function(i,s){t(i,s,e)}};Object.defineProperty(t,"__esModule",{value:!0}),t.OscLinkService=void 0;const n=i(2585);let o=t.OscLinkService=class{constructor(e){this._bufferService=e,this._nextId=1,this._entriesWithId=new Map,this._dataByLinkId=new Map}registerLink(e){const t=this._bufferService.buffer;if(void 0===e.id){const i=t.addMarker(t.ybase+t.y),s={data:e,id:this._nextId++,lines:[i]};return i.onDispose((()=>this._removeMarkerFromLink(s,i))),this._dataByLinkId.set(s.id,s),s.id}const i=e,s=this._getEntryIdKey(i),r=this._entriesWithId.get(s);if(r)return this.addLineToLink(r.id,t.ybase+t.y),r.id;const n=t.addMarker(t.ybase+t.y),o={id:this._nextId++,key:this._getEntryIdKey(i),data:i,lines:[n]};return n.onDispose((()=>this._removeMarkerFromLink(o,n))),this._entriesWithId.set(o.key,o),this._dataByLinkId.set(o.id,o),o.id}addLineToLink(e,t){const i=this._dataByLinkId.get(e);if(i&&i.lines.every((e=>e.line!==t))){const e=this._bufferService.buffer.addMarker(t);i.lines.push(e),e.onDispose((()=>this._removeMarkerFromLink(i,e)))}}getLinkData(e){return this._dataByLinkId.get(e)?.data}_getEntryIdKey(e){return`${e.id};;${e.uri}`}_removeMarkerFromLink(e,t){const i=e.lines.indexOf(t);-1!==i&&(e.lines.splice(i,1),0===e.lines.length&&(void 0!==e.data.id&&this._entriesWithId.delete(e.key),this._dataByLinkId.delete(e.id)))}};t.OscLinkService=o=s([r(0,n.IBufferService)],o)},8343:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0;const i="di$target",s="di$dependencies";t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e[s]||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);const r=function(e,t,n){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,r){t[i]===t?t[s].push({id:e,index:r}):(t[s]=[{id:e,index:r}],t[i]=t)}(r,e,n)};return r.toString=()=>e,t.serviceRegistry.set(e,r),r}},2585:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.IDecorationService=t.IUnicodeService=t.IOscLinkService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;const s=i(8343);var r;t.IBufferService=(0,s.createDecorator)("BufferService"),t.ICoreMouseService=(0,s.createDecorator)("CoreMouseService"),t.ICoreService=(0,s.createDecorator)("CoreService"),t.ICharsetService=(0,s.createDecorator)("CharsetService"),t.IInstantiationService=(0,s.createDecorator)("InstantiationService"),function(e){e[e.TRACE=0]="TRACE",e[e.DEBUG=1]="DEBUG",e[e.INFO=2]="INFO",e[e.WARN=3]="WARN",e[e.ERROR=4]="ERROR",e[e.OFF=5]="OFF"}(r||(t.LogLevelEnum=r={})),t.ILogService=(0,s.createDecorator)("LogService"),t.IOptionsService=(0,s.createDecorator)("OptionsService"),t.IOscLinkService=(0,s.createDecorator)("OscLinkService"),t.IUnicodeService=(0,s.createDecorator)("UnicodeService"),t.IDecorationService=(0,s.createDecorator)("DecorationService")},1480:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const s=i(8460),r=i(225);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}constructor(){this._providers=Object.create(null),this._active="",this._onChange=new s.EventEmitter,this.onChange=this._onChange.event;const e=new r.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const s=e.length;for(let r=0;r<s;++r){let o=e.charCodeAt(r);if(55296<=o&&o<=56319){if(++r>=s)return t+this.wcwidth(o);const i=e.charCodeAt(r);56320<=i&&i<=57343?o=1024*(o-55296)+i-56320+65536:t+=this.wcwidth(i)}const a=this.charProperties(o,i);let h=n.extractWidth(a);n.extractShouldJoin(a)&&(h-=n.extractWidth(i)),t+=h,i=a}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n}},t={};function i(s){var r=t[s];if(void 0!==r)return r.exports;var n=t[s]={exports:{}};return e[s].call(n.exports,n,n.exports,i),n.exports}var s={};return(()=>{var e=s;Object.defineProperty(e,"__esModule",{value:!0}),e.Terminal=void 0;const t=i(9042),r=i(3236),n=i(844),o=i(5741),a=i(8285),h=i(7975),c=i(7090),l=["cols","rows"];class d extends n.Disposable{constructor(e){super(),this._core=this.register(new r.Terminal(e)),this._addonManager=this.register(new o.AddonManager),this._publicOptions={...this._core.options};const t=e=>this._core.options[e],i=(e,t)=>{this._checkReadonlyOptions(e),this._core.options[e]=t};for(const e in this._core.options){const s={get:t.bind(this,e),set:i.bind(this,e)};Object.defineProperty(this._publicOptions,e,s)}}_checkReadonlyOptions(e){if(l.includes(e))throw new Error(`Option "${e}" can only be set in the constructor`)}_checkProposedApi(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error("You must set the allowProposedApi option to true to use proposed API")}get onBell(){return this._core.onBell}get onBinary(){return this._core.onBinary}get onCursorMove(){return this._core.onCursorMove}get onData(){return this._core.onData}get onKey(){return this._core.onKey}get onLineFeed(){return this._core.onLineFeed}get onRender(){return this._core.onRender}get onResize(){return this._core.onResize}get onScroll(){return this._core.onScroll}get onSelectionChange(){return this._core.onSelectionChange}get onTitleChange(){return this._core.onTitleChange}get onWriteParsed(){return this._core.onWriteParsed}get element(){return this._core.element}get parser(){return this._parser||(this._parser=new h.ParserApi(this._core)),this._parser}get unicode(){return this._checkProposedApi(),new c.UnicodeApi(this._core)}get textarea(){return this._core.textarea}get rows(){return this._core.rows}get cols(){return this._core.cols}get buffer(){return this._buffer||(this._buffer=this.register(new a.BufferNamespaceApi(this._core))),this._buffer}get markers(){return this._checkProposedApi(),this._core.markers}get modes(){const e=this._core.coreService.decPrivateModes;let t="none";switch(this._core.coreMouseService.activeProtocol){case"X10":t="x10";break;case"VT200":t="vt200";break;case"DRAG":t="drag";break;case"ANY":t="any"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}}get options(){return this._publicOptions}set options(e){for(const t in e)this._publicOptions[t]=e[t]}blur(){this._core.blur()}focus(){this._core.focus()}input(e,t=!0){this._core.input(e,t)}resize(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)}open(e){this._core.open(e)}attachCustomKeyEventHandler(e){this._core.attachCustomKeyEventHandler(e)}attachCustomWheelEventHandler(e){this._core.attachCustomWheelEventHandler(e)}registerLinkProvider(e){return this._core.registerLinkProvider(e)}registerCharacterJoiner(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)}deregisterCharacterJoiner(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)}registerMarker(e=0){return this._verifyIntegers(e),this._core.registerMarker(e)}registerDecoration(e){return this._checkProposedApi(),this._verifyPositiveIntegers(e.x??0,e.width??0,e.height??0),this._core.registerDecoration(e)}hasSelection(){return this._core.hasSelection()}select(e,t,i){this._verifyIntegers(e,t,i),this._core.select(e,t,i)}getSelection(){return this._core.getSelection()}getSelectionPosition(){return this._core.getSelectionPosition()}clearSelection(){this._core.clearSelection()}selectAll(){this._core.selectAll()}selectLines(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)}dispose(){super.dispose()}scrollLines(e){this._verifyIntegers(e),this._core.scrollLines(e)}scrollPages(e){this._verifyIntegers(e),this._core.scrollPages(e)}scrollToTop(){this._core.scrollToTop()}scrollToBottom(){this._core.scrollToBottom()}scrollToLine(e){this._verifyIntegers(e),this._core.scrollToLine(e)}clear(){this._core.clear()}write(e,t){this._core.write(e,t)}writeln(e,t){this._core.write(e),this._core.write("\r\n",t)}paste(e){this._core.paste(e)}refresh(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)}reset(){this._core.reset()}clearTextureAtlas(){this._core.clearTextureAtlas()}loadAddon(e){this._addonManager.loadAddon(this,e)}static get strings(){return t}_verifyIntegers(...e){for(const t of e)if(t===1/0||isNaN(t)||t%1!=0)throw new Error("This API only accepts integers")}_verifyPositiveIntegers(...e){for(const t of e)if(t&&(t===1/0||isNaN(t)||t%1!=0||t<0))throw new Error("This API only accepts positive integers")}}e.Terminal=d})(),s})()));
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0wsSUFBSyxJQUNMLElBQUssS0FRUCxFQUFBQSxTQUFBLEVBQWdCLENBQ2QsSUFBSyxJQUNMLElBQUssSUFDTCxLQUFNLElBQ04sSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxLQVFQLEVBQUFBLFNBQUEsRUFBZ0IsQ0FDZCxJQUFLLElBQ0wsSUFBSyxJQUNMLEtBQU0sSUFDTixJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxLQVFQLEVBQUFBLFNBQUEsRUFBZ0IsQ0FDZCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxLQUFNLElBQ04sSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBUVAsRUFBQUEsU0FBQSxFQUNBLEVBQUFBLFNBQUEsR0FBZ0IsQ0FDZCxJQUFLLElBQ0wsSUFBSyxJQUNMLEtBQU0sSUFDTixJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBUVAsRUFBQUEsU0FBQSxFQUFnQixDQUNkLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLEtBQU0sSUFDTixJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBUVAsRUFBQUEsU0FBQSxFQUNBLEVBQUFBLFNBQUEsR0FBZ0IsQ0FDZCxJQUFLLElBQ0wsSUFBSyxJQUNMLEtBQU0sSUFDTixJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLEtBUVAsRUFBQUEsU0FBQSxLQUFnQixDQUNkLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLEtBQU0sSUFDTixJQUFLLElBQ0wsSUFBSyxJQUVMLEVBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJQUNMLElBQUssSUFDTCxJQUFLLElBQ0wsSUFBSyxJLGVDclBQLElBQWlCdHJD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LENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFDN0MsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQVMsQ0FBQyxLQUFRLE1BQzdDLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUFTLENBQUMsS0FBUSxNQUM3QyxDQUFDLEtBQVEsTUFBUyxDQUFDLEtBQVEsTUFBUyxDQUFDLE1BQVEsT0FDN0MsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLE9BQVMsQ0FBQyxNQUFRLE9BQzdDLENBQUMsTUFBUSxPQUFTLENBQUMs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YWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvQWNjZXNzaWJpbGl0eU1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvQ2xpcGJvYXJkLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0NvbG9yQ29udHJhc3RDYWNoZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9MaWZlY3ljbGUudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvTGlua2lmaWVyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL0xvY2FsaXphYmxlU3RyaW5ncy50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9Pc2NMaW5rUHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvUmVuZGVyRGVib3VuY2VyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL1Rlcm1pbmFsLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL1RpbWVCYXNlZERlYm91bmNlci50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9WaWV3cG9ydC50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9kZWNvcmF0aW9ucy9CdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXIudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvZGVjb3JhdGlvbnMvQ29sb3Jab25lU3RvcmUudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvZGVjb3JhdGlvbnMvT3ZlcnZpZXdSdWxlclJlbmRlcmVyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL2lucHV0L0NvbXBvc2l0aW9uSGVscGVyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL2lucHV0L01vdXNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL2lucHV0L01vdmVUb0NlbGwudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvZG9tL0RvbVJlbmRlcmVyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3JlbmRlcmVyL2RvbS9Eb21SZW5kZXJlclJvd0ZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvZG9tL1dpZHRoQ2FjaGUudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL0NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvUmVuZGVyZXJVdGlscy50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvU2VsZWN0aW9uUmVuZGVyTW9kZWwudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VsZWN0aW9uL1NlbGVjdGlvbk1vZGVsLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL0NoYXJTaXplU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL0NvcmVCcm93c2VyU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9MaW5rUHJvdmlkZXJTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL01vdXNlU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9zZXJ2aWNlcy9SZW5kZXJTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9icm93c2VyL3NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2Jyb3dzZXIvc2VydmljZXMvVGhlbWVTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vQ2lyY3VsYXJMaXN0LnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vQ2xvbmUudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9Db2xvci50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL0NvcmVUZXJtaW5hbC50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL0V2ZW50RW1pdHRlci50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL0lucHV0SGFuZGxlci50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL0xpZmVjeWNsZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL011bHRpS2V5TWFwLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vUGxhdGZvcm0udHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9Tb3J0ZWRMaXN0LnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vVGFza1F1ZXVlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vV2luZG93c01vZGUudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9CdWZmZXIudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQnVmZmVyTGluZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9CdWZmZXJSYW5nZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9CdWZmZXJSZWZsb3cudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9idWZmZXIvQnVmZmVyU2V0LnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL0NlbGxEYXRhLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vYnVmZmVyL0NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL2J1ZmZlci9NYXJrZXIudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9kYXRhL0NoYXJzZXRzLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vZGF0YS9Fc2NhcGVTZXF1ZW5jZXMudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9pbnB1dC9LZXlib2FyZC50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL2lucHV0L1RleHREZWNvZGVyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vaW5wdXQvVW5pY29kZVY2LnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vaW5wdXQvV3JpdGVCdWZmZXIudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9pbnB1dC9YUGFyc2VDb2xvci50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3BhcnNlci9Db25zdGFudHMudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wYXJzZXIvRGNzUGFyc2VyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcGFyc2VyL0VzY2FwZVNlcXVlbmNlUGFyc2VyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcGFyc2VyL09zY1BhcnNlci50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3BhcnNlci9QYXJhbXMudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wdWJsaWMvQWRkb25NYW5hZ2VyLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcHVibGljL0J1ZmZlckFwaVZpZXcudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wdWJsaWMvQnVmZmVyTGluZUFwaVZpZXcudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9wdWJsaWMvQnVmZmVyTmFtZXNwYWNlQXBpLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vcHVibGljL1BhcnNlckFwaS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3B1YmxpYy9Vbmljb2RlQXBpLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvQnVmZmVyU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL0NoYXJzZXRTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvQ29yZU1vdXNlU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL0NvcmVTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvRGVjb3JhdGlvblNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9JbnN0YW50aWF0aW9uU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL0xvZ1NlcnZpY2UudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9PcHRpb25zU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvY29tbW9uL3NlcnZpY2VzL09zY0xpbmtTZXJ2aWNlLnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3h0ZXJtL3h0ZXJtL3NyYy9jb21tb24vc2VydmljZXMvU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8veHRlcm0veHRlcm0vc3JjL2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZS50cyIsIndlYnBhY2s6Ly94dGVybS94dGVybS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly94dGVybS94dGVybS9zcmMvYnJvd3Nlci9wdWJsaWMvVGVybWluYWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIHtcblx0XHR2YXIgYSA9IGZhY3RvcnkoKTtcblx0XHRmb3IodmFyIGkgaW4gYSkgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyA/IGV4cG9ydHMgOiByb290KVtpXSA9IGFbaV07XG5cdH1cbn0pKGdsb2JhbFRoaXMsICgpID0+IHtcbnJldHVybiAiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCAqIGFzIFN0cmluZ3MgZnJvbSAnYnJvd3Nlci9Mb2NhbGl6YWJsZVN0cmluZ3MnO1xuaW1wb3J0IHsgSVRlcm1pbmFsLCBJUmVuZGVyRGVib3VuY2VyIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBUaW1lQmFzZWREZWJvdW5jZXIgfSBmcm9tICdicm93c2VyL1RpbWVCYXNlZERlYm91bmNlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJSW5zdGFudGlhdGlvblNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyIH0gZnJvbSAnYnJvd3Nlci9MaWZlY3ljbGUnO1xuXG5jb25zdCBNQVhfUk9XU19UT19SRUFEID0gMjA7XG5cbmNvbnN0IGVudW0gQm91bmRhcnlQb3NpdGlvbiB7XG4gIFRPUCxcbiAgQk9UVE9NXG59XG5cbi8vIFR1cm4gdGhpcyBvbiB0byB1bmhpZGUgdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgZGlzcGxheSBpdCB1bmRlclxuLy8gKGluc3RlYWQgb2Ygb3ZlcmxhcHBpbmcgd2l0aCkgdGhlIHRlcm1pbmFsLlxuY29uc3QgREVCVUcgPSBmYWxzZTtcblxuZXhwb3J0IGNsYXNzIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgX2RlYnVnUm9vdENvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2FjY2Vzc2liaWxpdHlDb250YWluZXI6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgX3Jvd0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3Jvd0VsZW1lbnRzOiBIVE1MRWxlbWVudFtdO1xuICBwcml2YXRlIF9yb3dDb2x1bW5zOiBXZWFrTWFwPEhUTUxFbGVtZW50LCBudW1iZXJbXT4gPSBuZXcgV2Vha01hcCgpO1xuXG4gIHByaXZhdGUgX2xpdmVSZWdpb246IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9saXZlUmVnaW9uTGluZUNvdW50OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9saXZlUmVnaW9uRGVib3VuY2VyOiBJUmVuZGVyRGVib3VuY2VyO1xuXG4gIHByaXZhdGUgX3RvcEJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcjogKGU6IEZvY3VzRXZlbnQpID0+IHZvaWQ7XG4gIHByaXZhdGUgX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcjogKGU6IEZvY3VzRXZlbnQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgcXVldWUgaGFzIGEgY2hhcmFjdGVyIHB1c2hlZCB0byBpdCBmb3Iga2V5cyB0aGF0IGFyZSBwcmVzc2VkLCBpZiB0aGVcbiAgICogbmV4dCBjaGFyYWN0ZXIgYWRkZWQgdG8gdGhlIHRlcm1pbmFsIGlzIGVxdWFsIHRvIHRoZSBrZXkgY2hhciB0aGVuIGl0IGlzXG4gICAqIG5vdCBhbm5vdW5jZWQgKGFkZGVkIHRvIGxpdmUgcmVnaW9uKSBiZWNhdXNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gYW5ub3VuY2VkXG4gICAqIGJ5IHRoZSB0ZXh0YXJlYSBldmVudCAod2hpY2ggY2Fubm90IGJlIGNhbmNlbGVkKS4gVGhlcmUgYXJlIHNvbWUgcmFjZVxuICAgKiBjb25kaXRpb24gY2FzZXMgaWYgdGhlcmUgaXMgdHlwaW5nIHdoaWxlIGRhdGEgaXMgc3RyZWFtaW5nLCBidXQgdGhpcyBjb3ZlcnNcbiAgICogdGhlIG1haW4gY2FzZSBvZiB0eXBpbmcgaW50byB0aGUgcHJvbXB0IGFuZCBpbnB1dHRpbmcgdGhlIGFuc3dlciB0byBhXG4gICAqIHF1ZXN0aW9uIChZL04sIGV0Yy4pLlxuICAgKi9cbiAgcHJpdmF0ZSBfY2hhcnNUb0NvbnN1bWU6IHN0cmluZ1tdID0gW107XG5cbiAgcHJpdmF0ZSBfY2hhcnNUb0Fubm91bmNlOiBzdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXJtaW5hbDogSVRlcm1pbmFsLFxuICAgIEBJSW5zdGFudGlhdGlvblNlcnZpY2UgaW5zdGFudGlhdGlvblNlcnZpY2U6IElJbnN0YW50aWF0aW9uU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lciA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS1hY2Nlc3NpYmlsaXR5Jyk7XG5cbiAgICB0aGlzLl9yb3dDb250YWluZXIgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnbGlzdCcpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS1hY2Nlc3NpYmlsaXR5LXRyZWUnKTtcbiAgICB0aGlzLl9yb3dFbGVtZW50cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGVybWluYWwucm93czsgaSsrKSB7XG4gICAgICB0aGlzLl9yb3dFbGVtZW50c1tpXSA9IHRoaXMuX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpO1xuICAgICAgdGhpcy5fcm93Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3Jvd0VsZW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICB0aGlzLl90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXIgPSBlID0+IHRoaXMuX2hhbmRsZUJvdW5kYXJ5Rm9jdXMoZSwgQm91bmRhcnlQb3NpdGlvbi5UT1ApO1xuICAgIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lciA9IGUgPT4gdGhpcy5faGFuZGxlQm91bmRhcnlGb2N1cyhlLCBCb3VuZGFyeVBvc2l0aW9uLkJPVFRPTSk7XG4gICAgdGhpcy5fcm93RWxlbWVudHNbMF0uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXIpO1xuICAgIHRoaXMuX3Jvd0VsZW1lbnRzW3RoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAtIDFdLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcblxuICAgIHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fcm93Q29udGFpbmVyKTtcblxuICAgIHRoaXMuX2xpdmVSZWdpb24gPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UubWFpbkRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX2xpdmVSZWdpb24uY2xhc3NMaXN0LmFkZCgnbGl2ZS1yZWdpb24nKTtcbiAgICB0aGlzLl9saXZlUmVnaW9uLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ2Fzc2VydGl2ZScpO1xuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fbGl2ZVJlZ2lvbik7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbkRlYm91bmNlciA9IHRoaXMucmVnaXN0ZXIobmV3IFRpbWVCYXNlZERlYm91bmNlcih0aGlzLl9yZW5kZXJSb3dzLmJpbmQodGhpcykpKTtcblxuICAgIGlmICghdGhpcy5fdGVybWluYWwuZWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZW5hYmxlIGFjY2Vzc2liaWxpdHkgYmVmb3JlIFRlcm1pbmFsLm9wZW4nKTtcbiAgICB9XG5cbiAgICBpZiAoREVCVUcpIHtcbiAgICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZGVidWcnKTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkZWJ1ZycpO1xuXG4gICAgICAvLyBVc2UgYSBgPGRpdiBjbGFzcz1cInh0ZXJtXCI+YCBjb250YWluZXIgc28gdGhhdCB0aGUgY3NzIHdpbGwgc3RpbGwgYXBwbHkuXG4gICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuX2RlYnVnUm9vdENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybScpO1xuXG4gICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJy0tLS0tLXN0YXJ0IGExMXktLS0tLS0nKSk7XG4gICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fYWNjZXNzaWJpbGl0eUNvbnRhaW5lcik7XG4gICAgICB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJy0tLS0tLWVuZCBhMTF5LS0tLS0tJykpO1xuXG4gICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLl9kZWJ1Z1Jvb3RDb250YWluZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJiZWdpbicsIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIpO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25SZXNpemUoZSA9PiB0aGlzLl9oYW5kbGVSZXNpemUoZS5yb3dzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25SZW5kZXIoZSA9PiB0aGlzLl9yZWZyZXNoUm93cyhlLnN0YXJ0LCBlLmVuZCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uU2Nyb2xsKCgpID0+IHRoaXMuX3JlZnJlc2hSb3dzKCkpKTtcbiAgICAvLyBMaW5lIGZlZWQgaXMgYW4gaXNzdWUgYXMgdGhlIHByb21wdCB3b24ndCBiZSByZWFkIG91dCBhZnRlciBhIGNvbW1hbmQgaXMgcnVuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbkExMXlDaGFyKGNoYXIgPT4gdGhpcy5faGFuZGxlQ2hhcihjaGFyKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25MaW5lRmVlZCgoKSA9PiB0aGlzLl9oYW5kbGVDaGFyKCdcXG4nKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fdGVybWluYWwub25BMTF5VGFiKHNwYWNlQ291bnQgPT4gdGhpcy5faGFuZGxlVGFiKHNwYWNlQ291bnQpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90ZXJtaW5hbC5vbktleShlID0+IHRoaXMuX2hhbmRsZUtleShlLmtleSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3Rlcm1pbmFsLm9uQmx1cigoKSA9PiB0aGlzLl9jbGVhckxpdmVSZWdpb24oKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vbkRpbWVuc2lvbnNDaGFuZ2UoKCkgPT4gdGhpcy5fcmVmcmVzaFJvd3NEaW1lbnNpb25zKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihkb2N1bWVudCwgJ3NlbGVjdGlvbmNoYW5nZScsICgpID0+IHRoaXMuX2hhbmRsZVNlbGVjdGlvbkNoYW5nZSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25EcHJDaGFuZ2UoKCkgPT4gdGhpcy5fcmVmcmVzaFJvd3NEaW1lbnNpb25zKCkpKTtcblxuICAgIHRoaXMuX3JlZnJlc2hSb3dzKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgaWYgKERFQlVHKSB7XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdENvbnRhaW5lciEucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5Q29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoID0gMDtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUYWIoc3BhY2VDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFjZUNvdW50OyBpKyspIHtcbiAgICAgIHRoaXMuX2hhbmRsZUNoYXIoJyAnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDaGFyKGNoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9saXZlUmVnaW9uTGluZUNvdW50IDwgTUFYX1JPV1NfVE9fUkVBRCArIDEpIHtcbiAgICAgIGlmICh0aGlzLl9jaGFyc1RvQ29uc3VtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEhhdmUgdGhlIHNjcmVlbiByZWFkZXIgaWdub3JlIHRoZSBjaGFyIGlmIGl0IHdhcyBqdXN0IGlucHV0XG4gICAgICAgIGNvbnN0IHNoaWZ0ZWRDaGFyID0gdGhpcy5fY2hhcnNUb0NvbnN1bWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHNoaWZ0ZWRDaGFyICE9PSBjaGFyKSB7XG4gICAgICAgICAgdGhpcy5fY2hhcnNUb0Fubm91bmNlICs9IGNoYXI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NoYXJzVG9Bbm5vdW5jZSArPSBjaGFyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhciA9PT0gJ1xcbicpIHtcbiAgICAgICAgdGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCsrO1xuICAgICAgICBpZiAodGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCA9PT0gTUFYX1JPV1NfVE9fUkVBRCArIDEpIHtcbiAgICAgICAgICB0aGlzLl9saXZlUmVnaW9uLnRleHRDb250ZW50ICs9IFN0cmluZ3MudG9vTXVjaE91dHB1dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NsZWFyTGl2ZVJlZ2lvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9saXZlUmVnaW9uLnRleHRDb250ZW50ID0gJyc7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbkxpbmVDb3VudCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVLZXkoa2V5Q2hhcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fY2xlYXJMaXZlUmVnaW9uKCk7XG4gICAgLy8gT25seSBhZGQgdGhlIGNoYXIgaWYgdGhlcmUgaXMgbm8gY29udHJvbCBjaGFyYWN0ZXIuXG4gICAgaWYgKCEvXFxwe0NvbnRyb2x9L3UudGVzdChrZXlDaGFyKSkge1xuICAgICAgdGhpcy5fY2hhcnNUb0NvbnN1bWUucHVzaChrZXlDaGFyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoUm93cyhzdGFydD86IG51bWJlciwgZW5kPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbGl2ZVJlZ2lvbkRlYm91bmNlci5yZWZyZXNoKHN0YXJ0LCBlbmQsIHRoaXMuX3Rlcm1pbmFsLnJvd3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyUm93cyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlcjogSUJ1ZmZlciA9IHRoaXMuX3Rlcm1pbmFsLmJ1ZmZlcjtcbiAgICBjb25zdCBzZXRTaXplID0gYnVmZmVyLmxpbmVzLmxlbmd0aC50b1N0cmluZygpO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xuICAgICAgY29uc3QgbGluZSA9IGJ1ZmZlci5saW5lcy5nZXQoYnVmZmVyLnlkaXNwICsgaSk7XG4gICAgICBjb25zdCBjb2x1bW5zOiBudW1iZXJbXSA9IFtdO1xuICAgICAgY29uc3QgbGluZURhdGEgPSBsaW5lPy50cmFuc2xhdGVUb1N0cmluZyh0cnVlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29sdW1ucykgfHwgJyc7XG4gICAgICBjb25zdCBwb3NJblNldCA9IChidWZmZXIueWRpc3AgKyBpICsgMSkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50c1tpXTtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGlmIChsaW5lRGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbGVtZW50LmlubmVyVGV4dCA9ICdcXHUwMGEwJztcbiAgICAgICAgICB0aGlzLl9yb3dDb2x1bW5zLnNldChlbGVtZW50LCBbMCwgMV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBsaW5lRGF0YTtcbiAgICAgICAgICB0aGlzLl9yb3dDb2x1bW5zLnNldChlbGVtZW50LCBjb2x1bW5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1wb3NpbnNldCcsIHBvc0luU2V0KTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2V0c2l6ZScsIHNldFNpemUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9hbm5vdW5jZUNoYXJhY3RlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Fubm91bmNlQ2hhcmFjdGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2hhcnNUb0Fubm91bmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9saXZlUmVnaW9uLnRleHRDb250ZW50ICs9IHRoaXMuX2NoYXJzVG9Bbm5vdW5jZTtcbiAgICB0aGlzLl9jaGFyc1RvQW5ub3VuY2UgPSAnJztcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUJvdW5kYXJ5Rm9jdXMoZTogRm9jdXNFdmVudCwgcG9zaXRpb246IEJvdW5kYXJ5UG9zaXRpb24pOiB2b2lkIHtcbiAgICBjb25zdCBib3VuZGFyeUVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBiZWZvcmVCb3VuZGFyeUVsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50c1twb3NpdGlvbiA9PT0gQm91bmRhcnlQb3NpdGlvbi5UT1AgPyAxIDogdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoIC0gMl07XG5cbiAgICAvLyBEb24ndCBzY3JvbGwgaWYgdGhlIGJ1ZmZlciB0b3AgaGFzIHJlYWNoZWQgdGhlIGVuZCBpbiB0aGF0IGRpcmVjdGlvblxuICAgIGNvbnN0IHBvc0luU2V0ID0gYm91bmRhcnlFbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1wb3NpbnNldCcpO1xuICAgIGNvbnN0IGxhc3RSb3dQb3MgPSBwb3NpdGlvbiA9PT0gQm91bmRhcnlQb3NpdGlvbi5UT1AgPyAnMScgOiBgJHt0aGlzLl90ZXJtaW5hbC5idWZmZXIubGluZXMubGVuZ3RofWA7XG4gICAgaWYgKHBvc0luU2V0ID09PSBsYXN0Um93UG9zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRG9uJ3Qgc2Nyb2xsIHdoZW4gdGhlIGxhc3QgZm9jdXNlZCBpdGVtIHdhcyBub3QgdGhlIHNlY29uZCByb3cgKGZvY3VzIGlzIGdvaW5nIHRoZSBvdGhlclxuICAgIC8vIGRpcmVjdGlvbilcbiAgICBpZiAoZS5yZWxhdGVkVGFyZ2V0ICE9PSBiZWZvcmVCb3VuZGFyeUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgb2xkIGJvdW5kYXJ5IGVsZW1lbnQgZnJvbSBhcnJheVxuICAgIGxldCB0b3BCb3VuZGFyeUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIGxldCBib3R0b21Cb3VuZGFyeUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgIGlmIChwb3NpdGlvbiA9PT0gQm91bmRhcnlQb3NpdGlvbi5UT1ApIHtcbiAgICAgIHRvcEJvdW5kYXJ5RWxlbWVudCA9IGJvdW5kYXJ5RWxlbWVudDtcbiAgICAgIGJvdHRvbUJvdW5kYXJ5RWxlbWVudCA9IHRoaXMuX3Jvd0VsZW1lbnRzLnBvcCgpITtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmVDaGlsZChib3R0b21Cb3VuZGFyeUVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3BCb3VuZGFyeUVsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50cy5zaGlmdCgpITtcbiAgICAgIGJvdHRvbUJvdW5kYXJ5RWxlbWVudCA9IGJvdW5kYXJ5RWxlbWVudDtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BCb3VuZGFyeUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBvbGQgYm91bmRhcnkgZWxlbWVudHNcbiAgICB0b3BCb3VuZGFyeUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXIpO1xuICAgIGJvdHRvbUJvdW5kYXJ5RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICAvLyBBZGQgbmV3IGVsZW1lbnQgdG8gYXJyYXkvRE9NXG4gICAgaWYgKHBvc2l0aW9uID09PSBCb3VuZGFyeVBvc2l0aW9uLlRPUCkge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHRoaXMuX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpO1xuICAgICAgdGhpcy5fcm93RWxlbWVudHMudW5zaGlmdChuZXdFbGVtZW50KTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyYmVnaW4nLCBuZXdFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3RWxlbWVudCA9IHRoaXMuX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpO1xuICAgICAgdGhpcy5fcm93RWxlbWVudHMucHVzaChuZXdFbGVtZW50KTtcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIG5ldyBib3VuZGFyeSBlbGVtZW50c1xuICAgIHRoaXMuX3Jvd0VsZW1lbnRzWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fdG9wQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcbiAgICB0aGlzLl9yb3dFbGVtZW50c1t0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggLSAxXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX2JvdHRvbUJvdW5kYXJ5Rm9jdXNMaXN0ZW5lcik7XG5cbiAgICAvLyBTY3JvbGwgdXBcbiAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGxMaW5lcyhwb3NpdGlvbiA9PT0gQm91bmRhcnlQb3NpdGlvbi5UT1AgPyAtMSA6IDEpO1xuXG4gICAgLy8gRm9jdXMgbmV3IGJvdW5kYXJ5IGJlZm9yZSBlbGVtZW50XG4gICAgdGhpcy5fcm93RWxlbWVudHNbcG9zaXRpb24gPT09IEJvdW5kYXJ5UG9zaXRpb24uVE9QID8gMSA6IHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAtIDJdLmZvY3VzKCk7XG5cbiAgICAvLyBQcmV2ZW50IHRoZSBzdGFuZGFyZCBiZWhhdmlvclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKTtcbiAgICBpZiAoIXNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzZWxlY3Rpb24uaXNDb2xsYXBzZWQpIHtcbiAgICAgIC8vIE9ubHkgZG8gc29tZXRoaW5nIHdoZW4gdGhlIGFuY2hvck5vZGUgaXMgaW5zaWRlIHRoZSByb3cgY29udGFpbmVyLiBUaGlzXG4gICAgICAvLyBiZWhhdmlvciBtaXJyb3JzIHdoYXQgd2UgZG8gd2l0aCBtb3VzZSAtLS0gaWYgdGhlIG1vdXNlIGNsaWNrc1xuICAgICAgLy8gc29tZXdoZXJlIG91dHNpZGUgb2YgdGhlIHRlcm1pbmFsLCB3ZSBkb24ndCBjbGVhciB0aGUgc2VsZWN0aW9uLlxuICAgICAgaWYgKHRoaXMuX3Jvd0NvbnRhaW5lci5jb250YWlucyhzZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGVjdGlvbi5hbmNob3JOb2RlIHx8ICFzZWxlY3Rpb24uZm9jdXNOb2RlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdhbmNob3JOb2RlIGFuZC9vciBmb2N1c05vZGUgYXJlIG51bGwnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0d28gc2VsZWN0aW9uIHBvaW50cyBpbiBkb2N1bWVudCBvcmRlci5cbiAgICBsZXQgYmVnaW4gPSB7IG5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLCBvZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQgfTtcbiAgICBsZXQgZW5kID0geyBub2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLCBvZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldCB9O1xuICAgIGlmICgoYmVnaW4ubm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlbmQubm9kZSkgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykgfHwgKGJlZ2luLm5vZGUgPT09IGVuZC5ub2RlICYmIGJlZ2luLm9mZnNldCA+IGVuZC5vZmZzZXQpICkge1xuICAgICAgW2JlZ2luLCBlbmRdID0gW2VuZCwgYmVnaW5dO1xuICAgIH1cblxuICAgIC8vIENsYW1wIGJlZ2luL2VuZCB0byB0aGUgaW5zaWRlIG9mIHRoZSByb3cgY29udGFpbmVyLlxuICAgIGlmIChiZWdpbi5ub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMuX3Jvd0VsZW1lbnRzWzBdKSAmIChOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSB8IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSkge1xuICAgICAgYmVnaW4gPSB7IG5vZGU6IHRoaXMuX3Jvd0VsZW1lbnRzWzBdLmNoaWxkTm9kZXNbMF0sIG9mZnNldDogMCB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3Jvd0NvbnRhaW5lci5jb250YWlucyhiZWdpbi5ub2RlKSkge1xuICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gYGJlZ2luYCBpcyBiZWxvdyB0aGUgbGFzdCByb3cuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxhc3RSb3dFbGVtZW50ID0gdGhpcy5fcm93RWxlbWVudHMuc2xpY2UoLTEpWzBdO1xuICAgIGlmIChlbmQubm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihsYXN0Um93RWxlbWVudCkgJiAoTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgfCBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykpIHtcbiAgICAgIGVuZCA9IHtcbiAgICAgICAgbm9kZTogbGFzdFJvd0VsZW1lbnQsXG4gICAgICAgIG9mZnNldDogbGFzdFJvd0VsZW1lbnQudGV4dENvbnRlbnQ/Lmxlbmd0aCA/PyAwXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3Jvd0NvbnRhaW5lci5jb250YWlucyhlbmQubm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGBlbmRgIGlzIGFib3ZlIHRoZSBmaXJzdCByb3cuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdG9Sb3dDb2x1bW4gPSAoeyBub2RlLCBvZmZzZXQgfTogdHlwZW9mIGJlZ2luKToge3JvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcn0gfCBudWxsID0+IHtcbiAgICAgIC8vIGBub2RlYCBpcyBlaXRoZXIgdGhlIHJvdyBlbGVtZW50IG9yIHRoZSBUZXh0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgY29uc3Qgcm93RWxlbWVudDogYW55ID0gbm9kZSBpbnN0YW5jZW9mIFRleHQgPyBub2RlLnBhcmVudE5vZGUgOiBub2RlO1xuICAgICAgbGV0IHJvdyA9IHBhcnNlSW50KHJvd0VsZW1lbnQ/LmdldEF0dHJpYnV0ZSgnYXJpYS1wb3NpbnNldCcpLCAxMCkgLSAxO1xuICAgICAgaWYgKGlzTmFOKHJvdykpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdyb3cgaXMgaW52YWxpZC4gUmFjZSBjb25kaXRpb24/Jyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5fcm93Q29sdW1ucy5nZXQocm93RWxlbWVudCk7XG4gICAgICBpZiAoIWNvbHVtbnMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdjb2x1bW5zIGlzIG51bGwuIFJhY2UgY29uZGl0aW9uPycpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvbHVtbiA9IG9mZnNldCA8IGNvbHVtbnMubGVuZ3RoID8gY29sdW1uc1tvZmZzZXRdIDogY29sdW1ucy5zbGljZSgtMSlbMF0gKyAxO1xuICAgICAgaWYgKGNvbHVtbiA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICsrcm93O1xuICAgICAgICBjb2x1bW4gPSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcm93LFxuICAgICAgICBjb2x1bW5cbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGJlZ2luUm93Q29sdW1uID0gdG9Sb3dDb2x1bW4oYmVnaW4pO1xuICAgIGNvbnN0IGVuZFJvd0NvbHVtbiA9IHRvUm93Q29sdW1uKGVuZCk7XG5cbiAgICBpZiAoIWJlZ2luUm93Q29sdW1uIHx8ICFlbmRSb3dDb2x1bW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYmVnaW5Sb3dDb2x1bW4ucm93ID4gZW5kUm93Q29sdW1uLnJvdyB8fCAoYmVnaW5Sb3dDb2x1bW4ucm93ID09PSBlbmRSb3dDb2x1bW4ucm93ICYmIGJlZ2luUm93Q29sdW1uLmNvbHVtbiA+PSBlbmRSb3dDb2x1bW4uY29sdW1uKSkge1xuICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiB1bmxlc3Mgd2UgaGF2ZSBzb21lIGJ1Z3MuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmFuZ2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLl90ZXJtaW5hbC5zZWxlY3QoXG4gICAgICBiZWdpblJvd0NvbHVtbi5jb2x1bW4sXG4gICAgICBiZWdpblJvd0NvbHVtbi5yb3csXG4gICAgICAoZW5kUm93Q29sdW1uLnJvdyAtIGJlZ2luUm93Q29sdW1uLnJvdykgKiB0aGlzLl90ZXJtaW5hbC5jb2xzIC0gYmVnaW5Sb3dDb2x1bW4uY29sdW1uICsgZW5kUm93Q29sdW1uLmNvbHVtblxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVSZXNpemUocm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gUmVtb3ZlIGJvdHRvbSBib3VuZGFyeSBsaXN0ZW5lclxuICAgIHRoaXMuX3Jvd0VsZW1lbnRzW3RoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAtIDFdLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcblxuICAgIC8vIEdyb3cgcm93cyBhcyByZXF1aXJlZFxuICAgIGZvciAobGV0IGkgPSB0aGlzLl9yb3dDb250YWluZXIuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgdGhpcy5fdGVybWluYWwucm93czsgaSsrKSB7XG4gICAgICB0aGlzLl9yb3dFbGVtZW50c1tpXSA9IHRoaXMuX2NyZWF0ZUFjY2Vzc2liaWxpdHlUcmVlTm9kZSgpO1xuICAgICAgdGhpcy5fcm93Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX3Jvd0VsZW1lbnRzW2ldKTtcbiAgICB9XG4gICAgLy8gU2hyaW5rIHJvd3MgYXMgcmVxdWlyZWRcbiAgICB3aGlsZSAodGhpcy5fcm93RWxlbWVudHMubGVuZ3RoID4gcm93cykge1xuICAgICAgdGhpcy5fcm93Q29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0VsZW1lbnRzLnBvcCgpISk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGJvdHRvbSBib3VuZGFyeSBsaXN0ZW5lclxuICAgIHRoaXMuX3Jvd0VsZW1lbnRzW3RoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAtIDFdLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyKTtcblxuICAgIHRoaXMuX3JlZnJlc2hSb3dzRGltZW5zaW9ucygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQWNjZXNzaWJpbGl0eVRyZWVOb2RlKCk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdsaXN0aXRlbScpO1xuICAgIGVsZW1lbnQudGFiSW5kZXggPSAtMTtcbiAgICB0aGlzLl9yZWZyZXNoUm93RGltZW5zaW9ucyhlbGVtZW50KTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuICBwcml2YXRlIF9yZWZyZXNoUm93c0RpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlDb250YWluZXIuc3R5bGUud2lkdGggPSBgJHt0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy53aWR0aH1weGA7XG4gICAgaWYgKHRoaXMuX3Jvd0VsZW1lbnRzLmxlbmd0aCAhPT0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgdGhpcy5faGFuZGxlUmVzaXplKHRoaXMuX3Rlcm1pbmFsLnJvd3MpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Rlcm1pbmFsLnJvd3M7IGkrKykge1xuICAgICAgdGhpcy5fcmVmcmVzaFJvd0RpbWVuc2lvbnModGhpcy5fcm93RWxlbWVudHNbaV0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9yZWZyZXNoUm93RGltZW5zaW9ucyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDb3JlU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuLyoqXG4gKiBQcmVwYXJlcyB0ZXh0IHRvIGJlIHBhc3RlZCBpbnRvIHRoZSB0ZXJtaW5hbCBieSBub3JtYWxpemluZyB0aGUgbGluZSBlbmRpbmdzXG4gKiBAcGFyYW0gdGV4dCBUaGUgcGFzdGVkIHRleHQgdGhhdCBuZWVkcyBwcm9jZXNzaW5nIGJlZm9yZSBpbnNlcnRpbmcgaW50byB0aGUgdGVybWluYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVUZXh0Rm9yVGVybWluYWwodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxyJyk7XG59XG5cbi8qKlxuICogQnJhY2tldCB0ZXh0IGZvciBwYXN0ZSwgaWYgbmVjZXNzYXJ5LCBhcyBwZXIgaHR0cHM6Ly9jaXJ3LmluL2Jsb2cvYnJhY2tldGVkLXBhc3RlXG4gKiBAcGFyYW0gdGV4dCBUaGUgcGFzdGVkIHRleHQgdG8gYnJhY2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJhY2tldFRleHRGb3JQYXN0ZSh0ZXh0OiBzdHJpbmcsIGJyYWNrZXRlZFBhc3RlTW9kZTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChicmFja2V0ZWRQYXN0ZU1vZGUpIHtcbiAgICByZXR1cm4gJ1xceDFiWzIwMH4nICsgdGV4dCArICdcXHgxYlsyMDF+JztcbiAgfVxuICByZXR1cm4gdGV4dDtcbn1cblxuLyoqXG4gKiBCaW5kcyBjb3B5IGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGdpdmVuIHRlcm1pbmFsLlxuICogQHBhcmFtIGV2IFRoZSBvcmlnaW5hbCBjb3B5IGV2ZW50IHRvIGJlIGhhbmRsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlIYW5kbGVyKGV2OiBDbGlwYm9hcmRFdmVudCwgc2VsZWN0aW9uU2VydmljZTogSVNlbGVjdGlvblNlcnZpY2UpOiB2b2lkIHtcbiAgaWYgKGV2LmNsaXBib2FyZERhdGEpIHtcbiAgICBldi5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCBzZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvblRleHQpO1xuICB9XG4gIC8vIFByZXZlbnQgb3IgdGhlIG9yaWdpbmFsIHRleHQgd2lsbCBiZSBjb3BpZWQuXG4gIGV2LnByZXZlbnREZWZhdWx0KCk7XG59XG5cbi8qKlxuICogUmVkaXJlY3QgdGhlIGNsaXBib2FyZCdzIGRhdGEgdG8gdGhlIHRlcm1pbmFsJ3MgaW5wdXQgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVBhc3RlRXZlbnQoZXY6IENsaXBib2FyZEV2ZW50LCB0ZXh0YXJlYTogSFRNTFRleHRBcmVhRWxlbWVudCwgY29yZVNlcnZpY2U6IElDb3JlU2VydmljZSwgb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSk6IHZvaWQge1xuICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgaWYgKGV2LmNsaXBib2FyZERhdGEpIHtcbiAgICBjb25zdCB0ZXh0ID0gZXYuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0L3BsYWluJyk7XG4gICAgcGFzdGUodGV4dCwgdGV4dGFyZWEsIGNvcmVTZXJ2aWNlLCBvcHRpb25zU2VydmljZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhc3RlKHRleHQ6IHN0cmluZywgdGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQsIGNvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UpOiB2b2lkIHtcbiAgdGV4dCA9IHByZXBhcmVUZXh0Rm9yVGVybWluYWwodGV4dCk7XG4gIHRleHQgPSBicmFja2V0VGV4dEZvclBhc3RlKHRleHQsIGNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGUgJiYgb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5pZ25vcmVCcmFja2V0ZWRQYXN0ZU1vZGUgIT09IHRydWUpO1xuICBjb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KHRleHQsIHRydWUpO1xuICB0ZXh0YXJlYS52YWx1ZSA9ICcnO1xufVxuXG4vKipcbiAqIE1vdmVzIHRoZSB0ZXh0YXJlYSB1bmRlciB0aGUgbW91c2UgY3Vyc29yIGFuZCBmb2N1c2VzIGl0LlxuICogQHBhcmFtIGV2IFRoZSBvcmlnaW5hbCByaWdodCBjbGljayBldmVudCB0byBiZSBoYW5kbGVkLlxuICogQHBhcmFtIHRleHRhcmVhIFRoZSB0ZXJtaW5hbCdzIHRleHRhcmVhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZVRleHRBcmVhVW5kZXJNb3VzZUN1cnNvcihldjogTW91c2VFdmVudCwgdGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQsIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG5cbiAgLy8gQ2FsY3VsYXRlIHRleHRhcmVhIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gZWxlbWVudFxuICBjb25zdCBwb3MgPSBzY3JlZW5FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCBsZWZ0ID0gZXYuY2xpZW50WCAtIHBvcy5sZWZ0IC0gMTA7XG4gIGNvbnN0IHRvcCA9IGV2LmNsaWVudFkgLSBwb3MudG9wIC0gMTA7XG5cbiAgLy8gQnJpbmcgdGV4dGFyZWEgYXQgdGhlIGN1cnNvciBwb3NpdGlvblxuICB0ZXh0YXJlYS5zdHlsZS53aWR0aCA9ICcyMHB4JztcbiAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gJzIwcHgnO1xuICB0ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gYCR7bGVmdH1weGA7XG4gIHRleHRhcmVhLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gIHRleHRhcmVhLnN0eWxlLnpJbmRleCA9ICcxMDAwJztcblxuICB0ZXh0YXJlYS5mb2N1cygpO1xufVxuXG4vKipcbiAqIEJpbmQgdG8gcmlnaHQtY2xpY2sgZXZlbnQgYW5kIGFsbG93IHJpZ2h0LWNsaWNrIGNvcHkgYW5kIHBhc3RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmlnaHRDbGlja0hhbmRsZXIoZXY6IE1vdXNlRXZlbnQsIHRleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LCBzY3JlZW5FbGVtZW50OiBIVE1MRWxlbWVudCwgc2VsZWN0aW9uU2VydmljZTogSVNlbGVjdGlvblNlcnZpY2UsIHNob3VsZFNlbGVjdFdvcmQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgbW92ZVRleHRBcmVhVW5kZXJNb3VzZUN1cnNvcihldiwgdGV4dGFyZWEsIHNjcmVlbkVsZW1lbnQpO1xuXG4gIGlmIChzaG91bGRTZWxlY3RXb3JkKSB7XG4gICAgc2VsZWN0aW9uU2VydmljZS5yaWdodENsaWNrU2VsZWN0KGV2KTtcbiAgfVxuXG4gIC8vIEdldCB0ZXh0YXJlYSByZWFkeSB0byBjb3B5IGZyb20gdGhlIGNvbnRleHQgbWVudVxuICB0ZXh0YXJlYS52YWx1ZSA9IHNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0aW9uVGV4dDtcbiAgdGV4dGFyZWEuc2VsZWN0KCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvckNvbnRyYXN0Q2FjaGUgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElDb2xvciB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBUd29LZXlNYXAgfSBmcm9tICdjb21tb24vTXVsdGlLZXlNYXAnO1xuXG5leHBvcnQgY2xhc3MgQ29sb3JDb250cmFzdENhY2hlIGltcGxlbWVudHMgSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gIHByaXZhdGUgX2NvbG9yOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBJQ29sb3IgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcbiAgcHJpdmF0ZSBfY3NzOiBUd29LZXlNYXA8LyogYmcgKi9udW1iZXIsIC8qIGZnICovbnVtYmVyLCBzdHJpbmcgfCBudWxsPiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0Q3NzKGJnOiBudW1iZXIsIGZnOiBudW1iZXIsIHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5fY3NzLnNldChiZywgZmcsIHZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDc3MoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jc3MuZ2V0KGJnLCBmZyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlciwgdmFsdWU6IElDb2xvciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5zZXQoYmcsIGZnLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3IoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IElDb2xvciB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb2xvci5nZXQoYmcsIGZnKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9jb2xvci5jbGVhcigpO1xuICAgIHRoaXMuX2Nzcy5jbGVhcigpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuLyoqXG4gKiBBZGRzIGEgZGlzcG9zYWJsZSBsaXN0ZW5lciB0byBhIG5vZGUgaW4gdGhlIERPTSwgcmV0dXJuaW5nIHRoZSBkaXNwb3NhYmxlLlxuICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gYWRkIGEgbGlzdGVuZXIgdG8uXG4gKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBoYW5kbGVyIGZvciB0aGUgbGlzdGVuZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgYm9vbGVhbiBvciBvcHRpb25zIG9iamVjdCB0byBwYXNzIG9uIHRvIHRoZSBldmVudFxuICogbGlzdGVuZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIoXG4gIG5vZGU6IEVsZW1lbnQgfCBXaW5kb3cgfCBEb2N1bWVudCxcbiAgdHlwZTogc3RyaW5nLFxuICBoYW5kbGVyOiAoZTogYW55KSA9PiB2b2lkLFxuICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zXG4pOiBJRGlzcG9zYWJsZSB7XG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgbGV0IGRpc3Bvc2VkID0gZmFsc2U7XG4gIHJldHVybiB7XG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgaWYgKGRpc3Bvc2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9XG4gIH07XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXJDZWxsUG9zaXRpb24sIElMaW5rLCBJTGlua0RlY29yYXRpb25zLCBJTGlua1dpdGhTdGF0ZSwgSUxpbmtpZmllcjIsIElMaW5raWZpZXJFdmVudCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBkaXNwb3NlQXJyYXksIGdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUxpbmtQcm92aWRlclNlcnZpY2UsIElNb3VzZVNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBMaW5raWZpZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUxpbmtpZmllcjIge1xuICBwdWJsaWMgZ2V0IGN1cnJlbnRMaW5rKCk6IElMaW5rV2l0aFN0YXRlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2N1cnJlbnRMaW5rOyB9XG4gIHByb3RlY3RlZCBfY3VycmVudExpbms6IElMaW5rV2l0aFN0YXRlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9tb3VzZURvd25MaW5rOiBJTGlua1dpdGhTdGF0ZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbGFzdE1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2xpbmtDYWNoZURpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG4gIHByaXZhdGUgX2xhc3RCdWZmZXJDZWxsOiBJQnVmZmVyQ2VsbFBvc2l0aW9uIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9pc01vdXNlT3V0OiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfd2FzUmVzaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9hY3RpdmVQcm92aWRlclJlcGxpZXM6IE1hcDxOdW1iZXIsIElMaW5rV2l0aFN0YXRlW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY3RpdmVMaW5lOiBudW1iZXIgPSAtMTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vblNob3dMaW5rVW5kZXJsaW5lID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElMaW5raWZpZXJFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblNob3dMaW5rVW5kZXJsaW5lID0gdGhpcy5fb25TaG93TGlua1VuZGVybGluZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25IaWRlTGlua1VuZGVybGluZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJTGlua2lmaWVyRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25IaWRlTGlua1VuZGVybGluZSA9IHRoaXMuX29uSGlkZUxpbmtVbmRlcmxpbmUuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgQElNb3VzZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfbW91c2VTZXJ2aWNlOiBJTW91c2VTZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSxcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElMaW5rUHJvdmlkZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2xpbmtQcm92aWRlclNlcnZpY2U6IElMaW5rUHJvdmlkZXJTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZWdpc3RlcihnZXREaXNwb3NlQXJyYXlEaXNwb3NhYmxlKHRoaXMuX2xpbmtDYWNoZURpc3Bvc2FibGVzKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4ge1xuICAgICAgdGhpcy5fbGFzdE1vdXNlRXZlbnQgPSB1bmRlZmluZWQ7XG4gICAgICAvLyBDbGVhciBvdXQgbGluayBwcm92aWRlcnMgYXMgdGhleSBjb3VsZCBlYXNpbHkgY2F1c2UgYW4gZW1iZWRkZXIgbWVtb3J5IGxlYWtcbiAgICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uY2xlYXIoKTtcbiAgICB9KSk7XG4gICAgLy8gTGlzdGVuIHRvIHJlc2l6ZSB0byBjYXRjaCB0aGUgY2FzZSB3aGVyZSBpdCdzIHJlc2l6ZWQgYW5kIHRoZSBjdXJzb3IgaXMgb3V0IG9mIHRoZSB2aWV3cG9ydC5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2Uub25SZXNpemUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICAgICAgdGhpcy5fd2FzUmVzaXplZCA9IHRydWU7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX2VsZW1lbnQsICdtb3VzZWxlYXZlJywgKCkgPT4ge1xuICAgICAgdGhpcy5faXNNb3VzZU91dCA9IHRydWU7XG4gICAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX2VsZW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX2VsZW1lbnQsICdtb3VzZWRvd24nLCB0aGlzLl9oYW5kbGVNb3VzZURvd24uYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuX2VsZW1lbnQsICdtb3VzZXVwJywgdGhpcy5faGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpKSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9sYXN0TW91c2VFdmVudCA9IGV2ZW50O1xuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbkZyb21Nb3VzZUV2ZW50KGV2ZW50LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9tb3VzZVNlcnZpY2UpO1xuICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNNb3VzZU91dCA9IGZhbHNlO1xuXG4gICAgLy8gSWdub3JlIHRoZSBldmVudCBpZiBpdCdzIGFuIGVtYmVkZGVyIGNyZWF0ZWQgaG92ZXIgd2lkZ2V0XG4gICAgY29uc3QgY29tcG9zZWRQYXRoID0gZXZlbnQuY29tcG9zZWRQYXRoKCkgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvc2VkUGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gY29tcG9zZWRQYXRoW2ldO1xuICAgICAgLy8gSGl0IFRlcm1pbmFsLmVsZW1lbnQsIGJyZWFrIGFuZCBjb250aW51ZVxuICAgICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ3h0ZXJtJykpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBJdCdzIGEgaG92ZXIsIGRvbid0IHJlc3BlY3QgaG92ZXIgZXZlbnRcbiAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd4dGVybS1ob3ZlcicpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX2xhc3RCdWZmZXJDZWxsIHx8IChwb3NpdGlvbi54ICE9PSB0aGlzLl9sYXN0QnVmZmVyQ2VsbC54IHx8IHBvc2l0aW9uLnkgIT09IHRoaXMuX2xhc3RCdWZmZXJDZWxsLnkpKSB7XG4gICAgICB0aGlzLl9oYW5kbGVIb3Zlcihwb3NpdGlvbik7XG4gICAgICB0aGlzLl9sYXN0QnVmZmVyQ2VsbCA9IHBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUhvdmVyKHBvc2l0aW9uOiBJQnVmZmVyQ2VsbFBvc2l0aW9uKTogdm9pZCB7XG4gICAgLy8gVE9ETzogVGhpcyBjdXJyZW50bHkgZG9lcyBub3QgY2FjaGUgbGluayBwcm92aWRlciByZXN1bHRzIGFjcm9zcyB3cmFwcGVkIGxpbmVzLCBhY3RpdmVMaW5lXG4gICAgLy8gICAgICAgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlIGBhY3RpdmVSYW5nZToge3N0YXJ0WSwgZW5kWX1gXG4gICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBjbGVhciB0aGUgbGlua1xuICAgIGlmICh0aGlzLl9hY3RpdmVMaW5lICE9PSBwb3NpdGlvbi55IHx8IHRoaXMuX3dhc1Jlc2l6ZWQpIHtcbiAgICAgIHRoaXMuX2NsZWFyQ3VycmVudExpbmsoKTtcbiAgICAgIHRoaXMuX2Fza0ZvckxpbmsocG9zaXRpb24sIGZhbHNlKTtcbiAgICAgIHRoaXMuX3dhc1Jlc2l6ZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgaWYgdGhlIGxpbmsgaXMgaW4gdGhlIG1vdXNlIHBvc2l0aW9uXG4gICAgY29uc3QgaXNDdXJyZW50TGlua0luUG9zaXRpb24gPSB0aGlzLl9jdXJyZW50TGluayAmJiB0aGlzLl9saW5rQXRQb3NpdGlvbih0aGlzLl9jdXJyZW50TGluay5saW5rLCBwb3NpdGlvbik7XG4gICAgaWYgKCFpc0N1cnJlbnRMaW5rSW5Qb3NpdGlvbikge1xuICAgICAgdGhpcy5fY2xlYXJDdXJyZW50TGluaygpO1xuICAgICAgdGhpcy5fYXNrRm9yTGluayhwb3NpdGlvbiwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXNrRm9yTGluayhwb3NpdGlvbjogSUJ1ZmZlckNlbGxQb3NpdGlvbiwgdXNlTGluZUNhY2hlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMgfHwgIXVzZUxpbmVDYWNoZSkge1xuICAgICAgdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5mb3JFYWNoKHJlcGx5ID0+IHtcbiAgICAgICAgcmVwbHk/LmZvckVhY2gobGlua1dpdGhTdGF0ZSA9PiB7XG4gICAgICAgICAgaWYgKGxpbmtXaXRoU3RhdGUubGluay5kaXNwb3NlKSB7XG4gICAgICAgICAgICBsaW5rV2l0aFN0YXRlLmxpbmsuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcyA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuX2FjdGl2ZUxpbmUgPSBwb3NpdGlvbi55O1xuICAgIH1cbiAgICBsZXQgbGlua1Byb3ZpZGVkID0gZmFsc2U7XG5cbiAgICAvLyBUaGVyZSBpcyBubyBsaW5rIGNhY2hlZCwgc28gYXNrIGZvciBvbmVcbiAgICBmb3IgKGNvbnN0IFtpLCBsaW5rUHJvdmlkZXJdIG9mIHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UubGlua1Byb3ZpZGVycy5lbnRyaWVzKCkpIHtcbiAgICAgIGlmICh1c2VMaW5lQ2FjaGUpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdSZXBseSA9IHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uZ2V0KGkpO1xuICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIHJlcGx5LCB0aGUgcHJvdmlkZXIgaGFzbid0IHJlc3BvbmRlZCB5ZXQuXG5cbiAgICAgICAgLy8gVE9ETzogSWYgdGhlcmUgaXNuJ3QgYSByZXBseSB5ZXQgaXQgbWVhbnMgdGhhdCB0aGUgcHJvdmlkZXIgaXMgc3RpbGwgcmVzb2x2aW5nLiBFbnN1cmluZ1xuICAgICAgICAvLyBwcm92aWRlTGlua3MgaXNuJ3QgdHJpZ2dlcmVkIGFnYWluIHNhdmVzIElMaW5rLmhvdmVyIGZpcmluZyB0d2ljZSB0aG91Z2guIFRoaXMgcHJvYmFibHlcbiAgICAgICAgLy8gbmVlZHMgcHJvbWlzZXMgdG8gZ2V0IGZpeGVkXG4gICAgICAgIGlmIChleGlzdGluZ1JlcGx5KSB7XG4gICAgICAgICAgbGlua1Byb3ZpZGVkID0gdGhpcy5fY2hlY2tMaW5rUHJvdmlkZXJSZXN1bHQoaSwgcG9zaXRpb24sIGxpbmtQcm92aWRlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmtQcm92aWRlci5wcm92aWRlTGlua3MocG9zaXRpb24ueSwgKGxpbmtzOiBJTGlua1tdIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2lzTW91c2VPdXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbGlua3NXaXRoU3RhdGU6IElMaW5rV2l0aFN0YXRlW10gfCB1bmRlZmluZWQgPSBsaW5rcz8ubWFwKGxpbmsgID0+ICh7IGxpbmsgfSkpO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcz8uc2V0KGksIGxpbmtzV2l0aFN0YXRlKTtcbiAgICAgICAgICBsaW5rUHJvdmlkZWQgPSB0aGlzLl9jaGVja0xpbmtQcm92aWRlclJlc3VsdChpLCBwb3NpdGlvbiwgbGlua1Byb3ZpZGVkKTtcblxuICAgICAgICAgIC8vIElmIGFsbCBwcm92aWRlcnMgaGF2ZSByZXNwb25kZWQsIHJlbW92ZSBsb3dlciBwcmlvcml0eSBsaW5rcyB0aGF0IGludGVyc2VjdCByYW5nZXMgb2ZcbiAgICAgICAgICAvLyBoaWdoZXIgcHJpb3JpdHkgbGlua3NcbiAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzPy5zaXplID09PSB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLmxpbmtQcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVJbnRlcnNlY3RpbmdMaW5rcyhwb3NpdGlvbi55LCB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlSW50ZXJzZWN0aW5nTGlua3MoeTogbnVtYmVyLCByZXBsaWVzOiBNYXA8TnVtYmVyLCBJTGlua1dpdGhTdGF0ZVtdIHwgdW5kZWZpbmVkPik6IHZvaWQge1xuICAgIGNvbnN0IG9jY3VwaWVkQ2VsbHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcGxpZXMuc2l6ZTsgaSsrKSB7XG4gICAgICBjb25zdCBwcm92aWRlclJlcGx5ID0gcmVwbGllcy5nZXQoaSk7XG4gICAgICBpZiAoIXByb3ZpZGVyUmVwbHkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3ZpZGVyUmVwbHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGlua1dpdGhTdGF0ZSA9IHByb3ZpZGVyUmVwbHlbaV07XG4gICAgICAgIGNvbnN0IHN0YXJ0WCA9IGxpbmtXaXRoU3RhdGUubGluay5yYW5nZS5zdGFydC55IDwgeSA/IDAgOiBsaW5rV2l0aFN0YXRlLmxpbmsucmFuZ2Uuc3RhcnQueDtcbiAgICAgICAgY29uc3QgZW5kWCA9IGxpbmtXaXRoU3RhdGUubGluay5yYW5nZS5lbmQueSA+IHkgPyB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgOiBsaW5rV2l0aFN0YXRlLmxpbmsucmFuZ2UuZW5kLng7XG4gICAgICAgIGZvciAobGV0IHggPSBzdGFydFg7IHggPD0gZW5kWDsgeCsrKSB7XG4gICAgICAgICAgaWYgKG9jY3VwaWVkQ2VsbHMuaGFzKHgpKSB7XG4gICAgICAgICAgICBwcm92aWRlclJlcGx5LnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9jY3VwaWVkQ2VsbHMuYWRkKHgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2hlY2tMaW5rUHJvdmlkZXJSZXN1bHQoaW5kZXg6IG51bWJlciwgcG9zaXRpb246IElCdWZmZXJDZWxsUG9zaXRpb24sIGxpbmtQcm92aWRlZDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzKSB7XG4gICAgICByZXR1cm4gbGlua1Byb3ZpZGVkO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmtzID0gdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLmdldChpbmRleCk7XG5cbiAgICAvLyBDaGVjayBpZiBldmVyeSBwcm92aWRlciBiZWZvcmUgdGhpcyBvbmUgaGFzIGNvbWUgYmFjayB1bmRlZmluZWRcbiAgICBsZXQgaGFzTGlua0JlZm9yZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5kZXg7IGorKykge1xuICAgICAgaWYgKCF0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuaGFzKGopIHx8IHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5nZXQoaikpIHtcbiAgICAgICAgaGFzTGlua0JlZm9yZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYWxsIHByb3ZpZGVycyB3aXRoIGhpZ2hlciBwcmlvcml0eSBjYW1lIGJhY2sgdW5kZWZpbmVkLCB0aGVuIHRoaXMgcHJvdmlkZXIncyBsaW5rIGZvclxuICAgIC8vIHRoZSBwb3NpdGlvbiBzaG91bGQgYmUgdXNlZFxuICAgIGlmICghaGFzTGlua0JlZm9yZSAmJiBsaW5rcykge1xuICAgICAgY29uc3QgbGlua0F0UG9zaXRpb24gPSBsaW5rcy5maW5kKGxpbmsgPT4gdGhpcy5fbGlua0F0UG9zaXRpb24obGluay5saW5rLCBwb3NpdGlvbikpO1xuICAgICAgaWYgKGxpbmtBdFBvc2l0aW9uKSB7XG4gICAgICAgIGxpbmtQcm92aWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2hhbmRsZU5ld0xpbmsobGlua0F0UG9zaXRpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFsbCB0aGUgcHJvdmlkZXJzIGhhdmUgcmVzcG9uZGVkXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVByb3ZpZGVyUmVwbGllcy5zaXplID09PSB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLmxpbmtQcm92aWRlcnMubGVuZ3RoICYmICFsaW5rUHJvdmlkZWQpIHtcbiAgICAgIC8vIFJlc3BlY3QgdGhlIG9yZGVyIG9mIHRoZSBsaW5rIHByb3ZpZGVyc1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLl9hY3RpdmVQcm92aWRlclJlcGxpZXMuc2l6ZTsgaisrKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaW5rID0gdGhpcy5fYWN0aXZlUHJvdmlkZXJSZXBsaWVzLmdldChqKT8uZmluZChsaW5rID0+IHRoaXMuX2xpbmtBdFBvc2l0aW9uKGxpbmsubGluaywgcG9zaXRpb24pKTtcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgbGlua1Byb3ZpZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9oYW5kbGVOZXdMaW5rKGN1cnJlbnRMaW5rKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBsaW5rUHJvdmlkZWQ7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVNb3VzZURvd24oKTogdm9pZCB7XG4gICAgdGhpcy5fbW91c2VEb3duTGluayA9IHRoaXMuX2N1cnJlbnRMaW5rO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY3VycmVudExpbmspIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQoZXZlbnQsIHRoaXMuX2VsZW1lbnQsIHRoaXMuX21vdXNlU2VydmljZSk7XG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tb3VzZURvd25MaW5rID09PSB0aGlzLl9jdXJyZW50TGluayAmJiB0aGlzLl9saW5rQXRQb3NpdGlvbih0aGlzLl9jdXJyZW50TGluay5saW5rLCBwb3NpdGlvbikpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsuYWN0aXZhdGUoZXZlbnQsIHRoaXMuX2N1cnJlbnRMaW5rLmxpbmsudGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJDdXJyZW50TGluayhzdGFydFJvdz86IG51bWJlciwgZW5kUm93PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jdXJyZW50TGluayB8fCAhdGhpcy5fbGFzdE1vdXNlRXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgc3RhcnQgYW5kIGVuZCByb3csIGNoZWNrIHRoYXQgdGhlIGxpbmsgaXMgd2l0aGluIGl0XG4gICAgaWYgKCFzdGFydFJvdyB8fCAhZW5kUm93IHx8ICh0aGlzLl9jdXJyZW50TGluay5saW5rLnJhbmdlLnN0YXJ0LnkgPj0gc3RhcnRSb3cgJiYgdGhpcy5fY3VycmVudExpbmsubGluay5yYW5nZS5lbmQueSA8PSBlbmRSb3cpKSB7XG4gICAgICB0aGlzLl9saW5rTGVhdmUodGhpcy5fZWxlbWVudCwgdGhpcy5fY3VycmVudExpbmsubGluaywgdGhpcy5fbGFzdE1vdXNlRXZlbnQpO1xuICAgICAgdGhpcy5fY3VycmVudExpbmsgPSB1bmRlZmluZWQ7XG4gICAgICBkaXNwb3NlQXJyYXkodGhpcy5fbGlua0NhY2hlRGlzcG9zYWJsZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZU5ld0xpbmsobGlua1dpdGhTdGF0ZTogSUxpbmtXaXRoU3RhdGUpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2xhc3RNb3VzZUV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLl9wb3NpdGlvbkZyb21Nb3VzZUV2ZW50KHRoaXMuX2xhc3RNb3VzZUV2ZW50LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9tb3VzZVNlcnZpY2UpO1xuXG4gICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXIgaG92ZXIgaWYgdGhlIHdlIGhhdmUgYSBsaW5rIGF0IHRoZSBwb3NpdGlvblxuICAgIGlmICh0aGlzLl9saW5rQXRQb3NpdGlvbihsaW5rV2l0aFN0YXRlLmxpbmssIHBvc2l0aW9uKSkge1xuICAgICAgdGhpcy5fY3VycmVudExpbmsgPSBsaW5rV2l0aFN0YXRlO1xuICAgICAgdGhpcy5fY3VycmVudExpbmsuc3RhdGUgPSB7XG4gICAgICAgIGRlY29yYXRpb25zOiB7XG4gICAgICAgICAgdW5kZXJsaW5lOiBsaW5rV2l0aFN0YXRlLmxpbmsuZGVjb3JhdGlvbnMgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBsaW5rV2l0aFN0YXRlLmxpbmsuZGVjb3JhdGlvbnMudW5kZXJsaW5lLFxuICAgICAgICAgIHBvaW50ZXJDdXJzb3I6IGxpbmtXaXRoU3RhdGUubGluay5kZWNvcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGxpbmtXaXRoU3RhdGUubGluay5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yXG4gICAgICAgIH0sXG4gICAgICAgIGlzSG92ZXJlZDogdHJ1ZVxuICAgICAgfTtcbiAgICAgIHRoaXMuX2xpbmtIb3Zlcih0aGlzLl9lbGVtZW50LCBsaW5rV2l0aFN0YXRlLmxpbmssIHRoaXMuX2xhc3RNb3VzZUV2ZW50KTtcblxuICAgICAgLy8gQWRkIGxpc3RlbmVyIGZvciB0cmFja2luZyBkZWNvcmF0aW9ucyBjaGFuZ2VzXG4gICAgICBsaW5rV2l0aFN0YXRlLmxpbmsuZGVjb3JhdGlvbnMgPSB7fSBhcyBJTGlua0RlY29yYXRpb25zO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGlua1dpdGhTdGF0ZS5saW5rLmRlY29yYXRpb25zLCB7XG4gICAgICAgIHBvaW50ZXJDdXJzb3I6IHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZT8uZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvcixcbiAgICAgICAgICBzZXQ6IHYgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZSAmJiB0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5kZWNvcmF0aW9ucy5wb2ludGVyQ3Vyc29yICE9PSB2KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3IgPSB2O1xuICAgICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudExpbmsuc3RhdGUuaXNIb3ZlcmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd4dGVybS1jdXJzb3ItcG9pbnRlcicsIHYpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1bmRlcmxpbmU6IHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZT8uZGVjb3JhdGlvbnMudW5kZXJsaW5lLFxuICAgICAgICAgIHNldDogdiA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudExpbms/LnN0YXRlICYmIHRoaXMuX2N1cnJlbnRMaW5rPy5zdGF0ZT8uZGVjb3JhdGlvbnMudW5kZXJsaW5lICE9PSB2KSB7XG4gICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnVuZGVybGluZSA9IHY7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5pc0hvdmVyZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJlVW5kZXJsaW5lRXZlbnQobGlua1dpdGhTdGF0ZS5saW5rLCB2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiB0byB2aWV3cG9ydCBjaGFuZ2VzIHRvIHJlLXJlbmRlciB0aGUgbGluayB1bmRlciB0aGUgY3Vyc29yIChvbmx5IHdoZW4gdGhlIGxpbmUgdGhlXG4gICAgICAvLyBsaW5rIGlzIG9uIGNoYW5nZXMpXG4gICAgICB0aGlzLl9saW5rQ2FjaGVEaXNwb3NhYmxlcy5wdXNoKHRoaXMuX3JlbmRlclNlcnZpY2Uub25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlKGUgPT4ge1xuICAgICAgICAvLyBTYW5pdHkgY2hlY2ssIHRoaXMgc2hvdWxkbid0IGhhcHBlbiBpbiBwcmFjdGljZSBhcyB0aGlzIGxpc3RlbmVyIHdvdWxkIGJlIGRpc3Bvc2VkXG4gICAgICAgIGlmICghdGhpcy5fY3VycmVudExpbmspIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hlbiBzdGFydCBpcyAwIGEgc2Nyb2xsIG1vc3QgbGlrZWx5IG9jY3VycmVkLCBtYWtlIHN1cmUgbGlua3MgYWJvdmUgdGhlIGZvbGQgYWxzbyBnZXRcbiAgICAgICAgLy8gY2xlYXJlZC5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBlLnN0YXJ0ID09PSAwID8gMCA6IGUuc3RhcnQgKyAxICsgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7XG4gICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwICsgMSArIGUuZW5kO1xuICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBsaW5rIGlmIHRoZSB2aWV3cG9ydCBjaGFuZ2UgaGFwcGVuZWQgb24gdGhpcyBsaW5lXG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50TGluay5saW5rLnJhbmdlLnN0YXJ0LnkgPj0gc3RhcnQgJiYgdGhpcy5fY3VycmVudExpbmsubGluay5yYW5nZS5lbmQueSA8PSBlbmQpIHtcbiAgICAgICAgICB0aGlzLl9jbGVhckN1cnJlbnRMaW5rKHN0YXJ0LCBlbmQpO1xuICAgICAgICAgIGlmICh0aGlzLl9sYXN0TW91c2VFdmVudCkge1xuICAgICAgICAgICAgLy8gcmUtZXZhbCBwcmV2aW91c2x5IGFjdGl2ZSBsaW5rIGFmdGVyIGNoYW5nZXNcbiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5fcG9zaXRpb25Gcm9tTW91c2VFdmVudCh0aGlzLl9sYXN0TW91c2VFdmVudCwgdGhpcy5fZWxlbWVudCwgdGhpcy5fbW91c2VTZXJ2aWNlISk7XG4gICAgICAgICAgICBpZiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5fYXNrRm9yTGluayhwb3NpdGlvbiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBfbGlua0hvdmVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBsaW5rOiBJTGluaywgZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3VycmVudExpbms/LnN0YXRlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50TGluay5zdGF0ZS5pc0hvdmVyZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnVuZGVybGluZSkge1xuICAgICAgICB0aGlzLl9maXJlVW5kZXJsaW5lRXZlbnQobGluaywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY3VycmVudExpbmsuc3RhdGUuZGVjb3JhdGlvbnMucG9pbnRlckN1cnNvcikge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWN1cnNvci1wb2ludGVyJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmsuaG92ZXIpIHtcbiAgICAgIGxpbmsuaG92ZXIoZXZlbnQsIGxpbmsudGV4dCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZVVuZGVybGluZUV2ZW50KGxpbms6IElMaW5rLCBzaG93RXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCByYW5nZSA9IGxpbmsucmFuZ2U7XG4gICAgY29uc3Qgc2Nyb2xsT2Zmc2V0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7XG4gICAgY29uc3QgZXZlbnQgPSB0aGlzLl9jcmVhdGVMaW5rVW5kZXJsaW5lRXZlbnQocmFuZ2Uuc3RhcnQueCAtIDEsIHJhbmdlLnN0YXJ0LnkgLSBzY3JvbGxPZmZzZXQgLSAxLCByYW5nZS5lbmQueCwgcmFuZ2UuZW5kLnkgLSBzY3JvbGxPZmZzZXQgLSAxLCB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGVtaXR0ZXIgPSBzaG93RXZlbnQgPyB0aGlzLl9vblNob3dMaW5rVW5kZXJsaW5lIDogdGhpcy5fb25IaWRlTGlua1VuZGVybGluZTtcbiAgICBlbWl0dGVyLmZpcmUoZXZlbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9saW5rTGVhdmUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGxpbms6IElMaW5rLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jdXJyZW50TGluaz8uc3RhdGUpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnVuZGVybGluZSkge1xuICAgICAgICB0aGlzLl9maXJlVW5kZXJsaW5lRXZlbnQobGluaywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRMaW5rLnN0YXRlLmRlY29yYXRpb25zLnBvaW50ZXJDdXJzb3IpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd4dGVybS1jdXJzb3ItcG9pbnRlcicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5rLmxlYXZlKSB7XG4gICAgICBsaW5rLmxlYXZlKGV2ZW50LCBsaW5rLnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgYnVmZmVyIHBvc2l0aW9uIGlzIHdpdGhpbiB0aGUgbGlua1xuICAgKiBAcGFyYW0gbGlua1xuICAgKiBAcGFyYW0gcG9zaXRpb25cbiAgICovXG4gIHByaXZhdGUgX2xpbmtBdFBvc2l0aW9uKGxpbms6IElMaW5rLCBwb3NpdGlvbjogSUJ1ZmZlckNlbGxQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxvd2VyID0gbGluay5yYW5nZS5zdGFydC55ICogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzICsgbGluay5yYW5nZS5zdGFydC54O1xuICAgIGNvbnN0IHVwcGVyID0gbGluay5yYW5nZS5lbmQueSAqIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyArIGxpbmsucmFuZ2UuZW5kLng7XG4gICAgY29uc3QgY3VycmVudCA9IHBvc2l0aW9uLnkgKiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgKyBwb3NpdGlvbi54O1xuICAgIHJldHVybiAobG93ZXIgPD0gY3VycmVudCAmJiBjdXJyZW50IDw9IHVwcGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJ1ZmZlciBwb3NpdGlvbiBmcm9tIGEgbW91c2UgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9wb3NpdGlvbkZyb21Nb3VzZUV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgbW91c2VTZXJ2aWNlOiBJTW91c2VTZXJ2aWNlKTogSUJ1ZmZlckNlbGxQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29vcmRzID0gbW91c2VTZXJ2aWNlLmdldENvb3JkcyhldmVudCwgZWxlbWVudCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgIGlmICghY29vcmRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgeDogY29vcmRzWzBdLCB5OiBjb29yZHNbMV0gKyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlTGlua1VuZGVybGluZUV2ZW50KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGZnOiBudW1iZXIgfCB1bmRlZmluZWQpOiBJTGlua2lmaWVyRXZlbnQge1xuICAgIHJldHVybiB7IHgxLCB5MSwgeDIsIHkyLCBjb2xzOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIGZnIH07XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHN0cmluZ3MgdGhhdCBnZXQgZXhwb3J0ZWQgaW4gdGhlIEFQSSBzbyB0aGV5IGNhbiBiZSBsb2NhbGl6ZWRcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuZXhwb3J0IGxldCBwcm9tcHRMYWJlbCA9ICdUZXJtaW5hbCBpbnB1dCc7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbmV4cG9ydCBsZXQgdG9vTXVjaE91dHB1dCA9ICdUb28gbXVjaCBvdXRwdXQgdG8gYW5ub3VuY2UsIG5hdmlnYXRlIHRvIHJvd3MgbWFudWFsbHkgdG8gcmVhZCc7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJSYW5nZSwgSUxpbmsgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElMaW5rUHJvdmlkZXIgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBJT3NjTGlua1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgT3NjTGlua1Byb3ZpZGVyIGltcGxlbWVudHMgSUxpbmtQcm92aWRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElPc2NMaW5rU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vc2NMaW5rU2VydmljZTogSU9zY0xpbmtTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgcHVibGljIHByb3ZpZGVMaW5rcyh5OiBudW1iZXIsIGNhbGxiYWNrOiAobGlua3M6IElMaW5rW10gfCB1bmRlZmluZWQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KHkgLSAxKTtcbiAgICBpZiAoIWxpbmUpIHtcbiAgICAgIGNhbGxiYWNrKHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBJTGlua1tdID0gW107XG4gICAgY29uc3QgbGlua0hhbmRsZXIgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmxpbmtIYW5kbGVyO1xuICAgIGNvbnN0IGNlbGwgPSBuZXcgQ2VsbERhdGEoKTtcbiAgICBjb25zdCBsaW5lTGVuZ3RoID0gbGluZS5nZXRUcmltbWVkTGVuZ3RoKCk7XG4gICAgbGV0IGN1cnJlbnRMaW5rSWQgPSAtMTtcbiAgICBsZXQgY3VycmVudFN0YXJ0ID0gLTE7XG4gICAgbGV0IGZpbmlzaExpbmsgPSBmYWxzZTtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGxpbmVMZW5ndGg7IHgrKykge1xuICAgICAgLy8gTWlub3Igb3B0aW1pemF0aW9uLCBvbmx5IGNoZWNrIGZvciBjb250ZW50IGlmIHRoZXJlIGlzbid0IGEgbGluayBpbiBjYXNlIHRoZSBsaW5rIGVuZHMgd2l0aFxuICAgICAgLy8gYSBudWxsIGNlbGxcbiAgICAgIGlmIChjdXJyZW50U3RhcnQgPT09IC0xICYmICFsaW5lLmhhc0NvbnRlbnQoeCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGxpbmUubG9hZENlbGwoeCwgY2VsbCk7XG4gICAgICBpZiAoY2VsbC5oYXNFeHRlbmRlZEF0dHJzKCkgJiYgY2VsbC5leHRlbmRlZC51cmxJZCkge1xuICAgICAgICBpZiAoY3VycmVudFN0YXJ0ID09PSAtMSkge1xuICAgICAgICAgIGN1cnJlbnRTdGFydCA9IHg7XG4gICAgICAgICAgY3VycmVudExpbmtJZCA9IGNlbGwuZXh0ZW5kZWQudXJsSWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluaXNoTGluayA9IGNlbGwuZXh0ZW5kZWQudXJsSWQgIT09IGN1cnJlbnRMaW5rSWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjdXJyZW50U3RhcnQgIT09IC0xKSB7XG4gICAgICAgICAgZmluaXNoTGluayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmlzaExpbmsgfHwgKGN1cnJlbnRTdGFydCAhPT0gLTEgJiYgeCA9PT0gbGluZUxlbmd0aCAtIDEpKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLl9vc2NMaW5rU2VydmljZS5nZXRMaW5rRGF0YShjdXJyZW50TGlua0lkKT8udXJpO1xuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIC8vIFRoZXNlIHJhbmdlcyBhcmUgMS1iYXNlZFxuICAgICAgICAgIGNvbnN0IHJhbmdlOiBJQnVmZmVyUmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDoge1xuICAgICAgICAgICAgICB4OiBjdXJyZW50U3RhcnQgKyAxLFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kOiB7XG4gICAgICAgICAgICAgIC8vIE9mZnNldCBlbmQgeCBpZiBpdCdzIGEgbGluayB0aGF0IGVuZHMgb24gdGhlIGxhc3QgY2VsbCBpbiB0aGUgbGluZVxuICAgICAgICAgICAgICB4OiB4ICsgKCFmaW5pc2hMaW5rICYmIHggPT09IGxpbmVMZW5ndGggLSAxID8gMSA6IDApLFxuICAgICAgICAgICAgICB5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGxldCBpZ25vcmVMaW5rID0gZmFsc2U7XG4gICAgICAgICAgaWYgKCFsaW5rSGFuZGxlcj8uYWxsb3dOb25IdHRwUHJvdG9jb2xzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHRleHQpO1xuICAgICAgICAgICAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgICAgICAgICAgIGlnbm9yZUxpbmsgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBpbnZhbGlkIFVSTHMgdG8gcHJldmVudCB1bmV4cGVjdGVkIGJlaGF2aW9yc1xuICAgICAgICAgICAgICBpZ25vcmVMaW5rID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWlnbm9yZUxpbmspIHtcbiAgICAgICAgICAgIC8vIE9TQyBsaW5rcyBhbHdheXMgdXNlIHVuZGVybGluZSBhbmQgcG9pbnRlciBkZWNvcmF0aW9uc1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgYWN0aXZhdGU6IChlLCB0ZXh0KSA9PiAobGlua0hhbmRsZXIgPyBsaW5rSGFuZGxlci5hY3RpdmF0ZShlLCB0ZXh0LCByYW5nZSkgOiBkZWZhdWx0QWN0aXZhdGUoZSwgdGV4dCkpLFxuICAgICAgICAgICAgICBob3ZlcjogKGUsIHRleHQpID0+IGxpbmtIYW5kbGVyPy5ob3Zlcj8uKGUsIHRleHQsIHJhbmdlKSxcbiAgICAgICAgICAgICAgbGVhdmU6IChlLCB0ZXh0KSA9PiBsaW5rSGFuZGxlcj8ubGVhdmU/LihlLCB0ZXh0LCByYW5nZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5pc2hMaW5rID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQ2xlYXIgbGluayBvciBzdGFydCBhIG5ldyBsaW5rIGlmIG9uZSBzdGFydHMgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKGNlbGwuaGFzRXh0ZW5kZWRBdHRycygpICYmIGNlbGwuZXh0ZW5kZWQudXJsSWQpIHtcbiAgICAgICAgICBjdXJyZW50U3RhcnQgPSB4O1xuICAgICAgICAgIGN1cnJlbnRMaW5rSWQgPSBjZWxsLmV4dGVuZGVkLnVybElkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRTdGFydCA9IC0xO1xuICAgICAgICAgIGN1cnJlbnRMaW5rSWQgPSAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IEhhbmRsZSBmZXRjaGluZyBhbmQgcmV0dXJuaW5nIG90aGVyIGxpbmsgcmFuZ2VzIHRvIHVuZGVybGluZSBvdGhlciBsaW5rcyB3aXRoIHRoZSBzYW1lXG4gICAgLy8gICAgICAgaWRcbiAgICBjYWxsYmFjayhyZXN1bHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRBY3RpdmF0ZShlOiBNb3VzZUV2ZW50LCB1cmk6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhbnN3ZXIgPSBjb25maXJtKGBEbyB5b3Ugd2FudCB0byBuYXZpZ2F0ZSB0byAke3VyaX0/XFxuXFxuV0FSTklORzogVGhpcyBsaW5rIGNvdWxkIHBvdGVudGlhbGx5IGJlIGRhbmdlcm91c2ApO1xuICBpZiAoYW5zd2VyKSB7XG4gICAgY29uc3QgbmV3V2luZG93ID0gd2luZG93Lm9wZW4oKTtcbiAgICBpZiAobmV3V2luZG93KSB7XG4gICAgICB0cnkge1xuICAgICAgICBuZXdXaW5kb3cub3BlbmVyID0gbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBuby1vcCwgRWxlY3Ryb24gY2FuIHRocm93XG4gICAgICB9XG4gICAgICBuZXdXaW5kb3cubG9jYXRpb24uaHJlZiA9IHVyaTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdPcGVuaW5nIGxpbmsgYmxvY2tlZCBhcyBvcGVuZXIgY291bGQgbm90IGJlIGNsZWFyZWQnKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVJlbmRlckRlYm91bmNlcldpdGhDYWxsYmFjayB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIERlYm91bmNlcyBjYWxscyB0byByZW5kZXIgdGVybWluYWwgcm93cyB1c2luZyBhbmltYXRpb24gZnJhbWVzLlxuICovXG5leHBvcnQgY2xhc3MgUmVuZGVyRGVib3VuY2VyIGltcGxlbWVudHMgSVJlbmRlckRlYm91bmNlcldpdGhDYWxsYmFjayB7XG4gIHByaXZhdGUgX3Jvd1N0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Jvd0VuZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZWZyZXNoQ2FsbGJhY2tzOiBGcmFtZVJlcXVlc3RDYWxsYmFja1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcmVuZGVyQ2FsbGJhY2s6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fYW5pbWF0aW9uRnJhbWUpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZFJlZnJlc2hDYWxsYmFjayhjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXIge1xuICAgIHRoaXMuX3JlZnJlc2hDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgaWYgKCF0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl9pbm5lclJlZnJlc2goKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hbmltYXRpb25GcmFtZTtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoKHJvd1N0YXJ0OiBudW1iZXIgfCB1bmRlZmluZWQsIHJvd0VuZDogbnVtYmVyIHwgdW5kZWZpbmVkLCByb3dDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcm93Q291bnQgPSByb3dDb3VudDtcbiAgICAvLyBHZXQgdGhlIG1pbi9tYXggcm93IHN0YXJ0L2VuZCBmb3IgdGhlIGFyZyB2YWx1ZXNcbiAgICByb3dTdGFydCA9IHJvd1N0YXJ0ICE9PSB1bmRlZmluZWQgPyByb3dTdGFydCA6IDA7XG4gICAgcm93RW5kID0gcm93RW5kICE9PSB1bmRlZmluZWQgPyByb3dFbmQgOiB0aGlzLl9yb3dDb3VudCAtIDE7XG4gICAgLy8gU2V0IHRoZSBwcm9wZXJ0aWVzIHRvIHRoZSB1cGRhdGVkIHZhbHVlc1xuICAgIHRoaXMuX3Jvd1N0YXJ0ID0gdGhpcy5fcm93U3RhcnQgIT09IHVuZGVmaW5lZCA/IE1hdGgubWluKHRoaXMuX3Jvd1N0YXJ0LCByb3dTdGFydCkgOiByb3dTdGFydDtcbiAgICB0aGlzLl9yb3dFbmQgPSB0aGlzLl9yb3dFbmQgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KHRoaXMuX3Jvd0VuZCwgcm93RW5kKSA6IHJvd0VuZDtcblxuICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5faW5uZXJSZWZyZXNoKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5uZXJSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gTWFrZSBzdXJlIHZhbHVlcyBhcmUgc2V0XG4gICAgaWYgKHRoaXMuX3Jvd1N0YXJ0ID09PSB1bmRlZmluZWQgfHwgdGhpcy5fcm93RW5kID09PSB1bmRlZmluZWQgfHwgdGhpcy5fcm93Q291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fcnVuUmVmcmVzaENhbGxiYWNrcygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsYW1wIHZhbHVlc1xuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgodGhpcy5fcm93U3RhcnQsIDApO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHRoaXMuX3Jvd0VuZCwgdGhpcy5fcm93Q291bnQgLSAxKTtcblxuICAgIC8vIFJlc2V0IGRlYm91bmNlciAodGhpcyBoYXBwZW5zIGJlZm9yZSByZW5kZXIgY2FsbGJhY2sgYXMgdGhlIHJlbmRlciBjb3VsZCB0cmlnZ2VyIGl0IGFnYWluKVxuICAgIHRoaXMuX3Jvd1N0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jvd0VuZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIFJ1biByZW5kZXIgY2FsbGJhY2tcbiAgICB0aGlzLl9yZW5kZXJDYWxsYmFjayhzdGFydCwgZW5kKTtcbiAgICB0aGlzLl9ydW5SZWZyZXNoQ2FsbGJhY2tzKCk7XG4gIH1cblxuICBwcml2YXRlIF9ydW5SZWZyZXNoQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5fcmVmcmVzaENhbGxiYWNrcykge1xuICAgICAgY2FsbGJhY2soMCk7XG4gICAgfVxuICAgIHRoaXMuX3JlZnJlc2hDYWxsYmFja3MgPSBbXTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgQ2hyaXN0b3BoZXIgSmVmZnJleSAoTUlUIExpY2Vuc2UpXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBPcmlnaW5hbGx5IGZvcmtlZCBmcm9tICh3aXRoIHRoZSBhdXRob3IncyBwZXJtaXNzaW9uKTpcbiAqICAgRmFicmljZSBCZWxsYXJkJ3MgamF2YXNjcmlwdCB2dDEwMCBmb3IganNsaW51eDpcbiAqICAgaHR0cDovL2JlbGxhcmQub3JnL2pzbGludXgvXG4gKiAgIENvcHlyaWdodCAoYykgMjAxMSBGYWJyaWNlIEJlbGxhcmRcbiAqICAgVGhlIG9yaWdpbmFsIGRlc2lnbiByZW1haW5zLiBUaGUgdGVybWluYWwgaXRzZWxmXG4gKiAgIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGluY2x1ZGUgeHRlcm0gQ1NJIGNvZGVzLCBhbW9uZ1xuICogICBvdGhlciBmZWF0dXJlcy5cbiAqXG4gKiBUZXJtaW5hbCBFbXVsYXRpb24gUmVmZXJlbmNlczpcbiAqICAgaHR0cDovL3Z0MTAwLm5ldC9cbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy50eHRcbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sXG4gKiAgIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC92dHRlc3QvXG4gKiAgIGh0dHA6Ly93d3cuaW53YXAuY29tL3BkcDEwL2Fuc2ljb2RlLnR4dFxuICogICBodHRwOi8vbGludXguZGllLm5ldC9tYW4vNC9jb25zb2xlX2NvZGVzXG4gKiAgIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi83L3VyeHZ0XG4gKi9cblxuaW1wb3J0IHsgY29weUhhbmRsZXIsIGhhbmRsZVBhc3RlRXZlbnQsIG1vdmVUZXh0QXJlYVVuZGVyTW91c2VDdXJzb3IsIHBhc3RlLCByaWdodENsaWNrSGFuZGxlciB9IGZyb20gJ2Jyb3dzZXIvQ2xpcGJvYXJkJztcbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcbmltcG9ydCB7IExpbmtpZmllciB9IGZyb20gJy4vTGlua2lmaWVyJztcbmltcG9ydCAqIGFzIFN0cmluZ3MgZnJvbSAnYnJvd3Nlci9Mb2NhbGl6YWJsZVN0cmluZ3MnO1xuaW1wb3J0IHsgT3NjTGlua1Byb3ZpZGVyIH0gZnJvbSAnYnJvd3Nlci9Pc2NMaW5rUHJvdmlkZXInO1xuaW1wb3J0IHsgQ2hhcmFjdGVySm9pbmVySGFuZGxlciwgQ3VzdG9tS2V5RXZlbnRIYW5kbGVyLCBDdXN0b21XaGVlbEV2ZW50SGFuZGxlciwgSUJyb3dzZXIsIElCdWZmZXJSYW5nZSwgSUNvbXBvc2l0aW9uSGVscGVyLCBJTGlua2lmaWVyMiwgSVRlcm1pbmFsLCBJVmlld3BvcnQgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IFZpZXdwb3J0IH0gZnJvbSAnYnJvd3Nlci9WaWV3cG9ydCc7XG5pbXBvcnQgeyBCdWZmZXJEZWNvcmF0aW9uUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL2RlY29yYXRpb25zL0J1ZmZlckRlY29yYXRpb25SZW5kZXJlcic7XG5pbXBvcnQgeyBPdmVydmlld1J1bGVyUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL2RlY29yYXRpb25zL092ZXJ2aWV3UnVsZXJSZW5kZXJlcic7XG5pbXBvcnQgeyBDb21wb3NpdGlvbkhlbHBlciB9IGZyb20gJ2Jyb3dzZXIvaW5wdXQvQ29tcG9zaXRpb25IZWxwZXInO1xuaW1wb3J0IHsgRG9tUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL2RvbS9Eb21SZW5kZXJlcic7XG5pbXBvcnQgeyBJUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBDaGFyU2l6ZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL0NoYXJTaXplU2VydmljZSc7XG5pbXBvcnQgeyBDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlJztcbmltcG9ydCB7IENvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvQ29yZUJyb3dzZXJTZXJ2aWNlJztcbmltcG9ydCB7IE1vdXNlU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvTW91c2VTZXJ2aWNlJztcbmltcG9ydCB7IFJlbmRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1JlbmRlclNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSUxpbmtQcm92aWRlclNlcnZpY2UsIElNb3VzZVNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJU2VsZWN0aW9uU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9UaGVtZVNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbHMsIGNvbG9yIH0gZnJvbSAnY29tbW9uL0NvbG9yJztcbmltcG9ydCB7IENvcmVUZXJtaW5hbCB9IGZyb20gJ2NvbW1vbi9Db3JlVGVybWluYWwnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJRXZlbnQsIGZvcndhcmRFdmVudCB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0ICogYXMgQnJvd3NlciBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuaW1wb3J0IHsgQ29sb3JSZXF1ZXN0VHlwZSwgQ29yZU1vdXNlQWN0aW9uLCBDb3JlTW91c2VCdXR0b24sIENvcmVNb3VzZUV2ZW50VHlwZSwgSUNvbG9yRXZlbnQsIElUZXJtaW5hbE9wdGlvbnMsIEtleWJvYXJkUmVzdWx0VHlwZSwgU2Nyb2xsU291cmNlLCBTcGVjaWFsQ29sb3JJbmRleCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0FUVFJfREFUQSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyTGluZSc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBDMCwgQzFfRVNDQVBFRCB9IGZyb20gJ2NvbW1vbi9kYXRhL0VzY2FwZVNlcXVlbmNlcyc7XG5pbXBvcnQgeyBldmFsdWF0ZUtleWJvYXJkRXZlbnQgfSBmcm9tICdjb21tb24vaW5wdXQvS2V5Ym9hcmQnO1xuaW1wb3J0IHsgdG9SZ2JTdHJpbmcgfSBmcm9tICdjb21tb24vaW5wdXQvWFBhcnNlQ29sb3InO1xuaW1wb3J0IHsgRGVjb3JhdGlvblNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvRGVjb3JhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgSURlY29yYXRpb25TZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElEZWNvcmF0aW9uLCBJRGVjb3JhdGlvbk9wdGlvbnMsIElEaXNwb3NhYmxlLCBJTGlua1Byb3ZpZGVyLCBJTWFya2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZSB9IGZyb20gJy4uL2NvbW1vbi9JbnB1dEhhbmRsZXInO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eU1hbmFnZXIgfSBmcm9tICcuL0FjY2Vzc2liaWxpdHlNYW5hZ2VyJztcbmltcG9ydCB7IExpbmtQcm92aWRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL0xpbmtQcm92aWRlclNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgVGVybWluYWwgZXh0ZW5kcyBDb3JlVGVybWluYWwgaW1wbGVtZW50cyBJVGVybWluYWwge1xuICBwdWJsaWMgdGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmlld3BvcnRTY3JvbGxBcmVhOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdmlld3BvcnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaGVscGVyQ29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29tcG9zaXRpb25WaWV3OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgbGlua2lmaWVyOiBJTGlua2lmaWVyMiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfb3ZlcnZpZXdSdWxlclJlbmRlcmVyOiBPdmVydmlld1J1bGVyUmVuZGVyZXIgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGJyb3dzZXI6IElCcm93c2VyID0gQnJvd3NlciBhcyBhbnk7XG5cbiAgcHJpdmF0ZSBfY3VzdG9tS2V5RXZlbnRIYW5kbGVyOiBDdXN0b21LZXlFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyOiBDdXN0b21XaGVlbEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcblxuICAvLyBCcm93c2VyIHNlcnZpY2VzXG4gIHByaXZhdGUgX2RlY29yYXRpb25TZXJ2aWNlOiBEZWNvcmF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBfbGlua1Byb3ZpZGVyU2VydmljZTogSUxpbmtQcm92aWRlclNlcnZpY2U7XG5cbiAgLy8gT3B0aW9uYWwgYnJvd3NlciBzZXJ2aWNlc1xuICBwcml2YXRlIF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfbW91c2VTZXJ2aWNlOiBJTW91c2VTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uU2VydmljZTogSVNlbGVjdGlvblNlcnZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgd2hldGhlciB0aGUga2V5ZG93biBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYW5kIHRyaWdnZXJlZCBhIGRhdGEgZXZlbnQsIGlmIHNvXG4gICAqIHRoZSBrZXlwcmVzcyBldmVudCBzaG91bGQgbm90IHRyaWdnZXIgYSBkYXRhIGV2ZW50IGJ1dCBzaG91bGQgc3RpbGwgcHJpbnQgdG8gdGhlIHRleHRhcmVhIHNvXG4gICAqIHNjcmVlbiByZWFkZXJzIHdpbGwgYW5ub3VuY2UgaXQuXG4gICAqL1xuICBwcml2YXRlIF9rZXlEb3duSGFuZGxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHdoZXRoZXIgYSBrZXlkb3duIGV2ZW50IGhhcyBvY2N1cmVkIHNpbmNlIHRoZSBsYXN0IGtleXVwIGV2ZW50LCBpLmUuIHdoZXRoZXIgYSBrZXlcbiAgICogaXMgY3VycmVudGx5IFwicHJlc3NlZFwiLlxuICAgKi9cbiAgcHJpdmF0ZSBfa2V5RG93blNlZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVjb3JkcyB3aGV0aGVyIHRoZSBrZXlwcmVzcyBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYW5kIHRyaWdnZXJlZCBhIGRhdGEgZXZlbnQsIGlmIHNvXG4gICAqIHRoZSBpbnB1dCBldmVudCBzaG91bGQgbm90IHRyaWdnZXIgYSBkYXRhIGV2ZW50IGJ1dCBzaG91bGQgc3RpbGwgcHJpbnQgdG8gdGhlIHRleHRhcmVhIHNvXG4gICAqIHNjcmVlbiByZWFkZXJzIHdpbGwgYW5ub3VuY2UgaXQuXG4gICAqL1xuICBwcml2YXRlIF9rZXlQcmVzc0hhbmRsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVjb3JkcyB3aGV0aGVyIHRoZXJlIGhhcyBiZWVuIGEga2V5ZG93biBldmVudCBmb3IgYSBkZWFkIGtleSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBrZXlkb3duXG4gICAqIGV2ZW50IGZvciB0aGUgY29tcG9zZWQvYWx0ZXJuYXRpdmUgY2hhcmFjdGVyLiBJZiB3ZSBjYW5jZWwgdGhlIGtleWRvd24gZXZlbnQgZm9yIHRoZSBkZWFkIGtleSxcbiAgICogbm8gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCBmb3IgdGhlIGZpbmFsIGNoYXJhY3Rlci5cbiAgICovXG4gIHByaXZhdGUgX3VucHJvY2Vzc2VkRGVhZEtleTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyB2aWV3cG9ydDogSVZpZXdwb3J0IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jb21wb3NpdGlvbkhlbHBlcjogSUNvbXBvc2l0aW9uSGVscGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hY2Nlc3NpYmlsaXR5TWFuYWdlcjogTXV0YWJsZURpc3Bvc2FibGU8QWNjZXNzaWJpbGl0eU1hbmFnZXI+ID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25DdXJzb3JNb3ZlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DdXJzb3JNb3ZlID0gdGhpcy5fb25DdXJzb3JNb3ZlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbktleSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IGtleTogc3RyaW5nLCBkb21FdmVudDogS2V5Ym9hcmRFdmVudCB9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uS2V5ID0gdGhpcy5fb25LZXkuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVuZGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlciA9IHRoaXMuX29uUmVuZGVyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uVGl0bGVDaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uVGl0bGVDaGFuZ2UgPSB0aGlzLl9vblRpdGxlQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJlbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkJlbGwgPSB0aGlzLl9vbkJlbGwuZXZlbnQ7XG5cbiAgcHJpdmF0ZSBfb25Gb2N1cyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIGdldCBvbkZvY3VzKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9vbkZvY3VzLmV2ZW50OyB9XG4gIHByaXZhdGUgX29uQmx1ciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIGdldCBvbkJsdXIoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX29uQmx1ci5ldmVudDsgfVxuICBwcml2YXRlIF9vbkExMXlDaGFyRW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgZ2V0IG9uQTExeUNoYXIoKTogSUV2ZW50PHN0cmluZz4geyByZXR1cm4gdGhpcy5fb25BMTF5Q2hhckVtaXR0ZXIuZXZlbnQ7IH1cbiAgcHJpdmF0ZSBfb25BMTF5VGFiRW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgZ2V0IG9uQTExeVRhYigpOiBJRXZlbnQ8bnVtYmVyPiB7IHJldHVybiB0aGlzLl9vbkExMXlUYWJFbWl0dGVyLmV2ZW50OyB9XG4gIHByaXZhdGUgX29uV2lsbE9wZW4gPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+KCkpO1xuICBwdWJsaWMgZ2V0IG9uV2lsbE9wZW4oKTogSUV2ZW50PEhUTUxFbGVtZW50PiB7IHJldHVybiB0aGlzLl9vbldpbGxPcGVuLmV2ZW50OyB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogUGFydGlhbDxJVGVybWluYWxPcHRpb25zPiA9IHt9XG4gICkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fc2V0dXAoKTtcblxuICAgIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoRGVjb3JhdGlvblNlcnZpY2UpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSURlY29yYXRpb25TZXJ2aWNlLCB0aGlzLl9kZWNvcmF0aW9uU2VydmljZSk7XG4gICAgdGhpcy5fbGlua1Byb3ZpZGVyU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKExpbmtQcm92aWRlclNlcnZpY2UpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSUxpbmtQcm92aWRlclNlcnZpY2UsIHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UpO1xuICAgIHRoaXMuX2xpbmtQcm92aWRlclNlcnZpY2UucmVnaXN0ZXJMaW5rUHJvdmlkZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoT3NjTGlua1Byb3ZpZGVyKSk7XG5cbiAgICAvLyBTZXR1cCBJbnB1dEhhbmRsZXIgbGlzdGVuZXJzXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0QmVsbCgoKSA9PiB0aGlzLl9vbkJlbGwuZmlyZSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0UmVmcmVzaFJvd3MoKHN0YXJ0LCBlbmQpID0+IHRoaXMucmVmcmVzaChzdGFydCwgZW5kKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFNlbmRGb2N1cygoKSA9PiB0aGlzLl9yZXBvcnRGb2N1cygpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0UmVzZXQoKCkgPT4gdGhpcy5yZXNldCgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIub25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQodHlwZSA9PiB0aGlzLl9yZXBvcnRXaW5kb3dzT3B0aW9ucyh0eXBlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uQ29sb3IoKGV2ZW50KSA9PiB0aGlzLl9oYW5kbGVDb2xvckV2ZW50KGV2ZW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vbkN1cnNvck1vdmUsIHRoaXMuX29uQ3Vyc29yTW92ZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vblRpdGxlQ2hhbmdlLCB0aGlzLl9vblRpdGxlQ2hhbmdlKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5faW5wdXRIYW5kbGVyLm9uQTExeUNoYXIsIHRoaXMuX29uQTExeUNoYXJFbWl0dGVyKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5faW5wdXRIYW5kbGVyLm9uQTExeVRhYiwgdGhpcy5fb25BMTF5VGFiRW1pdHRlcikpO1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLm9uUmVzaXplKGUgPT4gdGhpcy5fYWZ0ZXJSZXNpemUoZS5jb2xzLCBlLnJvd3MpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmVsZW1lbnQ/LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCk7XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjb2xvciBldmVudCBmcm9tIGlucHV0aGFuZGxlciBmb3IgT1NDIDR8MTA0IHwgMTB8MTEwIHwgMTF8MTExIHwgMTJ8MTEyLlxuICAgKiBBbiBldmVudCBmcm9tIE9TQyA0fDEwNCBtYXkgY29udGFpbiBtdWx0aXBsZSBzZXQgb3IgcmVwb3J0IHJlcXVlc3RzLCBhbmQgbXVsdGlwbGVcbiAgICogb3Igbm9uZSByZXN0b3JlIHJlcXVlc3RzIChyZXNldHRpbmcgYWxsKSxcbiAgICogd2hpbGUgYW4gZXZlbnQgZnJvbSBPU0MgMTB8MTEwIHwgMTF8MTExIHwgMTJ8MTEyIGFsd2F5cyBjb250YWlucyBhIHNpbmdsZSByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlQ29sb3JFdmVudChldmVudDogSUNvbG9yRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RoZW1lU2VydmljZSkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgcmVxIG9mIGV2ZW50KSB7XG4gICAgICBsZXQgYWNjOiAnZm9yZWdyb3VuZCcgfCAnYmFja2dyb3VuZCcgfCAnY3Vyc29yJyB8ICdhbnNpJztcbiAgICAgIGxldCBpZGVudCA9ICcnO1xuICAgICAgc3dpdGNoIChyZXEuaW5kZXgpIHtcbiAgICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EOiAvLyBPU0MgMTAgfCAxMTBcbiAgICAgICAgICBhY2MgPSAnZm9yZWdyb3VuZCc7XG4gICAgICAgICAgaWRlbnQgPSAnMTAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkJBQ0tHUk9VTkQ6IC8vIE9TQyAxMSB8IDExMVxuICAgICAgICAgIGFjYyA9ICdiYWNrZ3JvdW5kJztcbiAgICAgICAgICBpZGVudCA9ICcxMSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQ1VSU09SOiAvLyBPU0MgMTIgfCAxMTJcbiAgICAgICAgICBhY2MgPSAnY3Vyc29yJztcbiAgICAgICAgICBpZGVudCA9ICcxMic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IC8vIE9TQyA0IHwgMTA0XG4gICAgICAgICAgLy8gd2UgY2FuIHNraXAgdGhlIFswLi4yNTVdIHJhbmdlIGNoZWNrIGhlcmUgKGFscmVhZHkgZG9uZSBpbiBpbnB1dGhhbmRsZXIpXG4gICAgICAgICAgYWNjID0gJ2Fuc2knO1xuICAgICAgICAgIGlkZW50ID0gJzQ7JyArIHJlcS5pbmRleDtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgY2FzZSBDb2xvclJlcXVlc3RUeXBlLlJFUE9SVDpcbiAgICAgICAgICBjb25zdCBjb2xvclJnYiA9IGNvbG9yLnRvQ29sb3JSR0IoYWNjID09PSAnYW5zaSdcbiAgICAgICAgICAgID8gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycy5hbnNpW3JlcS5pbmRleF1cbiAgICAgICAgICAgIDogdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9yc1thY2NdKTtcbiAgICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfV0ke2lkZW50fTske3RvUmdiU3RyaW5nKGNvbG9yUmdiKX0ke0MxX0VTQ0FQRUQuU1R9YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sb3JSZXF1ZXN0VHlwZS5TRVQ6XG4gICAgICAgICAgaWYgKGFjYyA9PT0gJ2Fuc2knKSB7XG4gICAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2UubW9kaWZ5Q29sb3JzKGNvbG9ycyA9PiBjb2xvcnMuYW5zaVtyZXEuaW5kZXhdID0gY2hhbm5lbHMudG9Db2xvciguLi5yZXEuY29sb3IpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmFycm93ZWRBY2MgPSBhY2M7XG4gICAgICAgICAgICB0aGlzLl90aGVtZVNlcnZpY2UubW9kaWZ5Q29sb3JzKGNvbG9ycyA9PiBjb2xvcnNbbmFycm93ZWRBY2NdID0gY2hhbm5lbHMudG9Db2xvciguLi5yZXEuY29sb3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFOlxuICAgICAgICAgIHRoaXMuX3RoZW1lU2VydmljZS5yZXN0b3JlQ29sb3IocmVxLmluZGV4KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX3NldHVwKCk6IHZvaWQge1xuICAgIHN1cGVyLl9zZXR1cCgpO1xuXG4gICAgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIHByb3BlcnR5IHRvIGFjdGl2ZSBidWZmZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGJ1ZmZlcigpOiBJQnVmZmVyIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1cyB0aGUgdGVybWluYWwuIERlbGVnYXRlcyBmb2N1cyBoYW5kbGluZyB0byB0aGUgdGVybWluYWwncyBET00gZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZXh0YXJlYSkge1xuICAgICAgdGhpcy50ZXh0YXJlYS5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlU2NyZWVuUmVhZGVyTW9kZU9wdGlvbkNoYW5nZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKCF0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlci52YWx1ZSAmJiB0aGlzLl9yZW5kZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlNYW5hZ2VyLnZhbHVlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQWNjZXNzaWJpbGl0eU1hbmFnZXIsIHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgZGVzaXJlZCBmb2N1cyBiZWhhdmlvciBvbiBhIGdpdmVuIHRlcm1pbmFsIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRleHRBcmVhRm9jdXMoZXY6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzKSB7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1tJJyk7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICB0aGlzLl9zaG93Q3Vyc29yKCk7XG4gICAgdGhpcy5fb25Gb2N1cy5maXJlKCk7XG4gIH1cblxuICAvKipcbiAgICogQmx1ciB0aGUgdGVybWluYWwsIGNhbGxpbmcgdGhlIGJsdXIgZnVuY3Rpb24gb24gdGhlIHRlcm1pbmFsJ3MgdW5kZXJseWluZ1xuICAgKiB0ZXh0YXJlYS5cbiAgICovXG4gIHB1YmxpYyBibHVyKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLnRleHRhcmVhPy5ibHVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhlIGRlc2lyZWQgYmx1ciBiZWhhdmlvciBvbiBhIGdpdmVuIHRlcm1pbmFsIG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVRleHRBcmVhQmx1cigpOiB2b2lkIHtcbiAgICAvLyBUZXh0IGNhbiBzYWZlbHkgYmUgcmVtb3ZlZCBvbiBibHVyLiBEb2luZyBpdCBlYXJsaWVyIGNvdWxkIGludGVyZmVyZSB3aXRoXG4gICAgLy8gc2NyZWVuIHJlYWRlcnMgcmVhZGluZyBpdCBvdXQuXG4gICAgdGhpcy50ZXh0YXJlYSEudmFsdWUgPSAnJztcbiAgICB0aGlzLnJlZnJlc2godGhpcy5idWZmZXIueSwgdGhpcy5idWZmZXIueSk7XG4gICAgaWYgKHRoaXMuY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnNlbmRGb2N1cykge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbTycpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzJyk7XG4gICAgdGhpcy5fb25CbHVyLmZpcmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNUZXh0QXJlYSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudGV4dGFyZWEgfHwgIXRoaXMuYnVmZmVyLmlzQ3Vyc29ySW5WaWV3cG9ydCB8fCB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEuaXNDb21wb3NpbmcgfHwgIXRoaXMuX3JlbmRlclNlcnZpY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3Vyc29yWSA9IHRoaXMuYnVmZmVyLnliYXNlICsgdGhpcy5idWZmZXIueTtcbiAgICBjb25zdCBidWZmZXJMaW5lID0gdGhpcy5idWZmZXIubGluZXMuZ2V0KGN1cnNvclkpO1xuICAgIGlmICghYnVmZmVyTGluZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJzb3JYID0gTWF0aC5taW4odGhpcy5idWZmZXIueCwgdGhpcy5jb2xzIC0gMSk7XG4gICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQ7XG4gICAgY29uc3Qgd2lkdGggPSBidWZmZXJMaW5lLmdldFdpZHRoKGN1cnNvclgpO1xuICAgIGNvbnN0IGNlbGxXaWR0aCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCAqIHdpZHRoO1xuICAgIGNvbnN0IGN1cnNvclRvcCA9IHRoaXMuYnVmZmVyLnkgKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0O1xuICAgIGNvbnN0IGN1cnNvckxlZnQgPSBjdXJzb3JYICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoO1xuXG4gICAgLy8gU3luYyB0aGUgdGV4dGFyZWEgdG8gdGhlIGV4YWN0IHBvc2l0aW9uIG9mIHRoZSBjb21wb3NpdGlvbiB2aWV3IHNvIHRoZSBJTUUga25vd3Mgd2hlcmUgdGhlXG4gICAgLy8gdGV4dCBpcy5cbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxlZnQgPSBjdXJzb3JMZWZ0ICsgJ3B4JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS53aWR0aCA9IGNlbGxXaWR0aCArICdweCc7XG4gICAgdGhpcy50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBjZWxsSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxpbmVIZWlnaHQgPSBjZWxsSGVpZ2h0ICsgJ3B4JztcbiAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnpJbmRleCA9ICctNSc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBkZWZhdWx0IGJlaGF2aW9yXG4gICAqL1xuICBwcml2YXRlIF9pbml0R2xvYmFsKCk6IHZvaWQge1xuICAgIHRoaXMuX2JpbmRLZXlzKCk7XG5cbiAgICAvLyBCaW5kIGNsaXBib2FyZCBmdW5jdGlvbmFsaXR5XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5lbGVtZW50ISwgJ2NvcHknLCAoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSA9PiB7XG4gICAgICAvLyBJZiBtb3VzZSBldmVudHMgYXJlIGFjdGl2ZSBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgaXMgZGlzYWJsZWQgYW5kXG4gICAgICAvLyBjb3B5IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSBob3N0IHByb2dyYW0uXG4gICAgICBpZiAoIXRoaXMuaGFzU2VsZWN0aW9uKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29weUhhbmRsZXIoZXZlbnQsIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhKTtcbiAgICB9KSk7XG4gICAgY29uc3QgcGFzdGVIYW5kbGVyV3JhcHBlciA9IChldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkID0+IGhhbmRsZVBhc3RlRXZlbnQoZXZlbnQsIHRoaXMudGV4dGFyZWEhLCB0aGlzLmNvcmVTZXJ2aWNlLCB0aGlzLm9wdGlvbnNTZXJ2aWNlKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ3Bhc3RlJywgcGFzdGVIYW5kbGVyV3JhcHBlcikpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuZWxlbWVudCEsICdwYXN0ZScsIHBhc3RlSGFuZGxlcldyYXBwZXIpKTtcblxuICAgIC8vIEhhbmRsZSByaWdodCBjbGljayBjb250ZXh0IG1lbnVzXG4gICAgaWYgKEJyb3dzZXIuaXNGaXJlZm94KSB7XG4gICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgYXBwZWFyIHRvIGZpcmUgdGhlIGNvbnRleHRtZW51IGV2ZW50IG9uIHJpZ2h0IGNsaWNrXG4gICAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLmVsZW1lbnQhLCAnbW91c2Vkb3duJywgKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgICByaWdodENsaWNrSGFuZGxlcihldmVudCwgdGhpcy50ZXh0YXJlYSEsIHRoaXMuc2NyZWVuRWxlbWVudCEsIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLCB0aGlzLm9wdGlvbnMucmlnaHRDbGlja1NlbGVjdHNXb3JkKTtcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLmVsZW1lbnQhLCAnY29udGV4dG1lbnUnLCAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgcmlnaHRDbGlja0hhbmRsZXIoZXZlbnQsIHRoaXMudGV4dGFyZWEhLCB0aGlzLnNjcmVlbkVsZW1lbnQhLCB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlISwgdGhpcy5vcHRpb25zLnJpZ2h0Q2xpY2tTZWxlY3RzV29yZCk7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSB0aGUgdGV4dGFyZWEgdW5kZXIgdGhlIGN1cnNvciB3aGVuIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eCB0byBlbnN1cmVcbiAgICAvLyBtaWRkbGUgY2xpY2sgdG8gcGFzdGUgc2VsZWN0aW9uIHdvcmtzLiBUaGlzIG9ubHkgYXBwZWFycyB0byB3b3JrIGluIENocm9tZVxuICAgIC8vIGF0IHRoZSB0aW1lIGlzIHdyaXRpbmcuXG4gICAgaWYgKEJyb3dzZXIuaXNMaW51eCkge1xuICAgICAgLy8gVXNlIGF1eGNsaWNrIGV2ZW50IG92ZXIgbW91c2Vkb3duIHRoZSBsYXR0ZXIgZG9lc24ndCBzZWVtIHRvIHdvcmsuIE5vdGVcbiAgICAgIC8vIHRoYXQgdGhlIHJlZ3VsYXIgY2xpY2sgZXZlbnQgZG9lc24ndCBmaXJlIGZvciB0aGUgbWlkZGxlIG1vdXNlIGJ1dHRvbi5cbiAgICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuZWxlbWVudCEsICdhdXhjbGljaycsIChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSAxKSB7XG4gICAgICAgICAgbW92ZVRleHRBcmVhVW5kZXJNb3VzZUN1cnNvcihldmVudCwgdGhpcy50ZXh0YXJlYSEsIHRoaXMuc2NyZWVuRWxlbWVudCEpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGtleSBoYW5kbGluZyB0byB0aGUgdGVybWluYWxcbiAgICovXG4gIHByaXZhdGUgX2JpbmRLZXlzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMudGV4dGFyZWEhLCAna2V5dXAnLCAoZXY6IEtleWJvYXJkRXZlbnQpID0+IHRoaXMuX2tleVVwKGV2KSwgdHJ1ZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMudGV4dGFyZWEhLCAna2V5ZG93bicsIChldjogS2V5Ym9hcmRFdmVudCkgPT4gdGhpcy5fa2V5RG93bihldiksIHRydWUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2tleXByZXNzJywgKGV2OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLl9rZXlQcmVzcyhldiksIHRydWUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2NvbXBvc2l0aW9uc3RhcnQnLCAoKSA9PiB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEuY29tcG9zaXRpb25zdGFydCgpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSEsICdjb21wb3NpdGlvbnVwZGF0ZScsIChlOiBDb21wb3NpdGlvbkV2ZW50KSA9PiB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEuY29tcG9zaXRpb251cGRhdGUoZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2NvbXBvc2l0aW9uZW5kJywgKCkgPT4gdGhpcy5fY29tcG9zaXRpb25IZWxwZXIhLmNvbXBvc2l0aW9uZW5kKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhISwgJ2lucHV0JywgKGV2OiBJbnB1dEV2ZW50KSA9PiB0aGlzLl9pbnB1dEV2ZW50KGV2KSwgdHJ1ZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vblJlbmRlcigoKSA9PiB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciEudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cygpKSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIHRlcm1pbmFsIHdpdGhpbiBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyZW50IFRoZSBlbGVtZW50IHRvIGNyZWF0ZSB0aGUgdGVybWluYWwgd2l0aGluLlxuICAgKi9cbiAgcHVibGljIG9wZW4ocGFyZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlcm1pbmFsIHJlcXVpcmVzIGEgcGFyZW50IGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQuaXNDb25uZWN0ZWQpIHtcbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Rlcm1pbmFsLm9wZW4gd2FzIGNhbGxlZCBvbiBhbiBlbGVtZW50IHRoYXQgd2FzIG5vdCBhdHRhY2hlZCB0byB0aGUgRE9NJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHRlcm1pbmFsIGlzIGFscmVhZHkgb3BlbmVkXG4gICAgaWYgKHRoaXMuZWxlbWVudD8ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UpIHtcbiAgICAgIC8vIEFkanVzdCB0aGUgd2luZG93IGlmIG5lZWRlZFxuICAgICAgaWYgKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICE9PSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93KSB7XG4gICAgICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cgPSB0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50O1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSAmJiB0aGlzLm9wdGlvbnMuZG9jdW1lbnRPdmVycmlkZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7XG4gICAgICB0aGlzLl9kb2N1bWVudCA9IHRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kb2N1bWVudE92ZXJyaWRlIGFzIERvY3VtZW50O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBtYWluIGVsZW1lbnQgY29udGFpbmVyXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5lbGVtZW50LmRpciA9ICdsdHInOyAgIC8vIHh0ZXJtLmNzcyBhc3N1bWVzIExUUlxuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0ZXJtaW5hbCcpO1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybScpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuXG4gICAgLy8gUGVyZm9ybWFuY2U6IFVzZSBhIGRvY3VtZW50IGZyYWdtZW50IHRvIGJ1aWxkIHRoZSB0ZXJtaW5hbFxuICAgIC8vIHZpZXdwb3J0IGFuZCBoZWxwZXIgZWxlbWVudHMgZGV0YWNoZWQgZnJvbSB0aGUgRE9NXG4gICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXZpZXdwb3J0Jyk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdmlld3BvcnRFbGVtZW50KTtcblxuICAgIHRoaXMuX3ZpZXdwb3J0U2Nyb2xsQXJlYSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3ZpZXdwb3J0U2Nyb2xsQXJlYS5jbGFzc0xpc3QuYWRkKCd4dGVybS1zY3JvbGwtYXJlYScpO1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEpO1xuXG4gICAgdGhpcy5zY3JlZW5FbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5zY3JlZW5FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXNjcmVlbicpO1xuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKHRoaXMuc2NyZWVuRWxlbWVudCwgJ21vdXNlbW92ZScsIChldjogTW91c2VFdmVudCkgPT4gdGhpcy51cGRhdGVDdXJzb3JTdHlsZShldikpKTtcbiAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lciB0aGF0IHdpbGwgaG9sZCBoZWxwZXJzIGxpa2UgdGhlIHRleHRhcmVhIGZvclxuICAgIC8vIGNhcHR1cmluZyBET00gRXZlbnRzLiBUaGVuIHByb2R1Y2UgdGhlIGhlbHBlcnMuXG4gICAgdGhpcy5faGVscGVyQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5faGVscGVyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWhlbHBlcnMnKTtcbiAgICB0aGlzLnNjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVscGVyQ29udGFpbmVyKTtcbiAgICBmcmFnbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNjcmVlbkVsZW1lbnQpO1xuXG4gICAgdGhpcy50ZXh0YXJlYSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5jbGFzc0xpc3QuYWRkKCd4dGVybS1oZWxwZXItdGV4dGFyZWEnKTtcbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIFN0cmluZ3MucHJvbXB0TGFiZWwpO1xuICAgIGlmICghQnJvd3Nlci5pc0Nocm9tZU9TKSB7XG4gICAgICAvLyBDaHJvbWVWb3ggb24gQ2hyb21lT1MgZG9lcyBub3QgbGlrZSB0aGlzLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzI2MDE3MDM5N1xuICAgICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbXVsdGlsaW5lJywgJ2ZhbHNlJyk7XG4gICAgfVxuICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhdXRvY29ycmVjdCcsICdvZmYnKTtcbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXV0b2NhcGl0YWxpemUnLCAnb2ZmJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAnZmFsc2UnKTtcbiAgICB0aGlzLnRleHRhcmVhLnRhYkluZGV4ID0gMDtcblxuICAgIC8vIFJlZ2lzdGVyIHRoZSBjb3JlIGJyb3dzZXIgc2VydmljZSBiZWZvcmUgdGhlIGdlbmVyaWMgdGV4dGFyZWEgaGFuZGxlcnMgYXJlIHJlZ2lzdGVyZWQgc28gaXRcbiAgICAvLyBoYW5kbGVzIHRoZW0gZmlyc3QuIE90aGVyd2lzZSB0aGUgcmVuZGVyZXJzIG1heSB1c2UgdGhlIHdyb25nIGZvY3VzIHN0YXRlLlxuICAgIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgICAgdGhpcy50ZXh0YXJlYSxcbiAgICAgIHBhcmVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ID8/IHdpbmRvdyxcbiAgICAgIC8vIEZvcmNlIHVuc2FmZSBudWxsIGluIG5vZGUuanMgZW52aXJvbm1lbnQgZm9yIHRlc3RzXG4gICAgICB0aGlzLl9kb2N1bWVudCA/PyAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpID8gd2luZG93LmRvY3VtZW50IDogbnVsbCBhcyBhbnlcbiAgICApKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElDb3JlQnJvd3NlclNlcnZpY2UsIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLnRleHRhcmVhLCAnZm9jdXMnLCAoZXY6IEZvY3VzRXZlbnQpID0+IHRoaXMuX2hhbmRsZVRleHRBcmVhRm9jdXMoZXYpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy50ZXh0YXJlYSwgJ2JsdXInLCAoKSA9PiB0aGlzLl9oYW5kbGVUZXh0QXJlYUJsdXIoKSkpO1xuICAgIHRoaXMuX2hlbHBlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnRleHRhcmVhKTtcblxuICAgIHRoaXMuX2NoYXJTaXplU2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENoYXJTaXplU2VydmljZSwgdGhpcy5fZG9jdW1lbnQsIHRoaXMuX2hlbHBlckNvbnRhaW5lcik7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ2hhclNpemVTZXJ2aWNlLCB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UpO1xuXG4gICAgdGhpcy5fdGhlbWVTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoVGhlbWVTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElUaGVtZVNlcnZpY2UsIHRoaXMuX3RoZW1lU2VydmljZSk7XG5cbiAgICB0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ2hhcmFjdGVySm9pbmVyU2VydmljZSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ2hhcmFjdGVySm9pbmVyU2VydmljZSwgdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSk7XG5cbiAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShSZW5kZXJTZXJ2aWNlLCB0aGlzLnJvd3MsIHRoaXMuc2NyZWVuRWxlbWVudCkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSVJlbmRlclNlcnZpY2UsIHRoaXMuX3JlbmRlclNlcnZpY2UpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UoZSA9PiB0aGlzLl9vblJlbmRlci5maXJlKGUpKSk7XG4gICAgdGhpcy5vblJlc2l6ZShlID0+IHRoaXMuX3JlbmRlclNlcnZpY2UhLnJlc2l6ZShlLmNvbHMsIGUucm93cykpO1xuXG4gICAgdGhpcy5fY29tcG9zaXRpb25WaWV3ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LmNsYXNzTGlzdC5hZGQoJ2NvbXBvc2l0aW9uLXZpZXcnKTtcbiAgICB0aGlzLl9jb21wb3NpdGlvbkhlbHBlciA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENvbXBvc2l0aW9uSGVscGVyLCB0aGlzLnRleHRhcmVhLCB0aGlzLl9jb21wb3NpdGlvblZpZXcpO1xuICAgIHRoaXMuX2hlbHBlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9jb21wb3NpdGlvblZpZXcpO1xuXG4gICAgdGhpcy5fbW91c2VTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTW91c2VTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElNb3VzZVNlcnZpY2UsIHRoaXMuX21vdXNlU2VydmljZSk7XG5cbiAgICB0aGlzLmxpbmtpZmllciA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoTGlua2lmaWVyLCB0aGlzLnNjcmVlbkVsZW1lbnQpKTtcblxuICAgIC8vIFBlcmZvcm1hbmNlOiBBZGQgdmlld3BvcnQgYW5kIGhlbHBlciBlbGVtZW50cyBmcm9tIHRoZSBmcmFnbWVudFxuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5fb25XaWxsT3Blbi5maXJlKHRoaXMuZWxlbWVudCk7XG4gICAgfVxuICAgIGNhdGNoIHsgLyogZmFpbHMgdG8gbG9hZCBhZGRvbiBmb3Igc29tZSByZWFzb24gKi8gfVxuICAgIGlmICghdGhpcy5fcmVuZGVyU2VydmljZS5oYXNSZW5kZXJlcigpKSB7XG4gICAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlLnNldFJlbmRlcmVyKHRoaXMuX2NyZWF0ZVJlbmRlcmVyKCkpO1xuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQgPSB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShWaWV3cG9ydCwgdGhpcy5fdmlld3BvcnRFbGVtZW50LCB0aGlzLl92aWV3cG9ydFNjcm9sbEFyZWEpO1xuICAgIHRoaXMudmlld3BvcnQub25SZXF1ZXN0U2Nyb2xsTGluZXMoZSA9PiB0aGlzLnNjcm9sbExpbmVzKGUuYW1vdW50LCBlLnN1cHByZXNzU2Nyb2xsRXZlbnQsIFNjcm9sbFNvdXJjZS5WSUVXUE9SVCkpLFxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5faW5wdXRIYW5kbGVyLm9uUmVxdWVzdFN5bmNTY3JvbGxCYXIoKCkgPT4gdGhpcy52aWV3cG9ydCEuc3luY1Njcm9sbEFyZWEoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy52aWV3cG9ydCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub25DdXJzb3JNb3ZlKCgpID0+IHtcbiAgICAgIHRoaXMuX3JlbmRlclNlcnZpY2UhLmhhbmRsZUN1cnNvck1vdmUoKTtcbiAgICAgIHRoaXMuX3N5bmNUZXh0QXJlYSgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub25SZXNpemUoKCkgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlUmVzaXplKHRoaXMuY29scywgdGhpcy5yb3dzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vbkJsdXIoKCkgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlQmx1cigpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9uRm9jdXMoKCkgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlRm9jdXMoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vbkRpbWVuc2lvbnNDaGFuZ2UoKCkgPT4gdGhpcy52aWV3cG9ydCEuc3luY1Njcm9sbEFyZWEoKSkpO1xuXG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoU2VsZWN0aW9uU2VydmljZSxcbiAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgIHRoaXMuc2NyZWVuRWxlbWVudCxcbiAgICAgIHRoaXMubGlua2lmaWVyXG4gICAgKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJU2VsZWN0aW9uU2VydmljZSwgdGhpcy5fc2VsZWN0aW9uU2VydmljZSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLm9uUmVxdWVzdFNjcm9sbExpbmVzKGUgPT4gdGhpcy5zY3JvbGxMaW5lcyhlLmFtb3VudCwgZS5zdXBwcmVzc1Njcm9sbEV2ZW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fc2VsZWN0aW9uU2VydmljZS5vblNlbGVjdGlvbkNoYW5nZSgoKSA9PiB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3NlbGVjdGlvblNlcnZpY2Uub25SZXF1ZXN0UmVkcmF3KGUgPT4gdGhpcy5fcmVuZGVyU2VydmljZSEuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChlLnN0YXJ0LCBlLmVuZCwgZS5jb2x1bW5TZWxlY3RNb2RlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fc2VsZWN0aW9uU2VydmljZS5vbkxpbnV4TW91c2VTZWxlY3Rpb24odGV4dCA9PiB7XG4gICAgICAvLyBJZiB0aGVyZSdzIGEgbmV3IHNlbGVjdGlvbiwgcHV0IGl0IGludG8gdGhlIHRleHRhcmVhLCBmb2N1cyBhbmQgc2VsZWN0IGl0XG4gICAgICAvLyBpbiBvcmRlciB0byByZWdpc3RlciBpdCBhcyBhIHNlbGVjdGlvbiBvbiB0aGUgT1MuIFRoaXMgZXZlbnQgaXMgZmlyZWRcbiAgICAgIC8vIG9ubHkgb24gTGludXggdG8gZW5hYmxlIG1pZGRsZSBjbGljayB0byBwYXN0ZSBzZWxlY3Rpb24uXG4gICAgICB0aGlzLnRleHRhcmVhIS52YWx1ZSA9IHRleHQ7XG4gICAgICB0aGlzLnRleHRhcmVhIS5mb2N1cygpO1xuICAgICAgdGhpcy50ZXh0YXJlYSEuc2VsZWN0KCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb25TY3JvbGwuZXZlbnQoZXYgPT4ge1xuICAgICAgdGhpcy52aWV3cG9ydCEuc3luY1Njcm9sbEFyZWEoKTtcbiAgICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLnJlZnJlc2goKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5fdmlld3BvcnRFbGVtZW50LCAnc2Nyb2xsJywgKCkgPT4gdGhpcy5fc2VsZWN0aW9uU2VydmljZSEucmVmcmVzaCgpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEJ1ZmZlckRlY29yYXRpb25SZW5kZXJlciwgdGhpcy5zY3JlZW5FbGVtZW50KSk7XG4gICAgdGhpcy5yZWdpc3RlcihhZGREaXNwb3NhYmxlRG9tTGlzdGVuZXIodGhpcy5lbGVtZW50LCAnbW91c2Vkb3duJywgKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMuX3NlbGVjdGlvblNlcnZpY2UhLmhhbmRsZU1vdXNlRG93bihlKSkpO1xuXG4gICAgLy8gYXBwbHkgbW91c2UgZXZlbnQgY2xhc3NlcyBzZXQgYnkgZXNjYXBlIGNvZGVzIGJlZm9yZSB0ZXJtaW5hbCB3YXMgYXR0YWNoZWRcbiAgICBpZiAodGhpcy5jb3JlTW91c2VTZXJ2aWNlLmFyZU1vdXNlRXZlbnRzQWN0aXZlKSB7XG4gICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmRpc2FibGUoKTtcbiAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdlbmFibGUtbW91c2UtZXZlbnRzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UuZW5hYmxlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zY3JlZW5SZWFkZXJNb2RlKSB7XG4gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGRvbmUgKmFmdGVyKiB0aGUgcmVuZGVyZXIgaXMgY3JlYXRlZCBpbiBvcmRlciB0b1xuICAgICAgLy8gZW5zdXJlIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHRoZSBkcHJjaGFuZ2UgZXZlbnRcbiAgICAgIHRoaXMuX2FjY2Vzc2liaWxpdHlNYW5hZ2VyLnZhbHVlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQWNjZXNzaWJpbGl0eU1hbmFnZXIsIHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMub3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnc2NyZWVuUmVhZGVyTW9kZScsIGUgPT4gdGhpcy5faGFuZGxlU2NyZWVuUmVhZGVyTW9kZU9wdGlvbkNoYW5nZShlKSkpO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vdmVydmlld1J1bGVyV2lkdGgpIHtcbiAgICAgIHRoaXMuX292ZXJ2aWV3UnVsZXJSZW5kZXJlciA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoT3ZlcnZpZXdSdWxlclJlbmRlcmVyLCB0aGlzLl92aWV3cG9ydEVsZW1lbnQsIHRoaXMuc2NyZWVuRWxlbWVudCkpO1xuICAgIH1cbiAgICB0aGlzLm9wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ292ZXJ2aWV3UnVsZXJXaWR0aCcsIHZhbHVlID0+IHtcbiAgICAgIGlmICghdGhpcy5fb3ZlcnZpZXdSdWxlclJlbmRlcmVyICYmIHZhbHVlICYmIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCAmJiB0aGlzLnNjcmVlbkVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5fb3ZlcnZpZXdSdWxlclJlbmRlcmVyID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShPdmVydmlld1J1bGVyUmVuZGVyZXIsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudCwgdGhpcy5zY3JlZW5FbGVtZW50KSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gTWVhc3VyZSB0aGUgY2hhcmFjdGVyIHNpemVcbiAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2UubWVhc3VyZSgpO1xuXG4gICAgLy8gU2V0dXAgbG9vcCB0aGF0IGRyYXdzIHRvIHNjcmVlblxuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcblxuICAgIC8vIEluaXRpYWxpemUgZ2xvYmFsIGFjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHRha2VuIG9uIHRoZSBkb2N1bWVudC5cbiAgICB0aGlzLl9pbml0R2xvYmFsKCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIG1vdXNlIGV2ZW50cyBhbmQgdHJhbnNsYXRlXG4gICAgLy8gdGhlbSBpbnRvIHRlcm1pbmFsIG1vdXNlIHByb3RvY29scy5cbiAgICB0aGlzLmJpbmRNb3VzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlUmVuZGVyZXIoKTogSVJlbmRlcmVyIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoRG9tUmVuZGVyZXIsIHRoaXMsIHRoaXMuX2RvY3VtZW50ISwgdGhpcy5lbGVtZW50ISwgdGhpcy5zY3JlZW5FbGVtZW50ISwgdGhpcy5fdmlld3BvcnRFbGVtZW50ISwgdGhpcy5faGVscGVyQ29udGFpbmVyISwgdGhpcy5saW5raWZpZXIhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIGNlcnRhaW4gbW91c2UgZXZlbnRzIHRvIHRoZSB0ZXJtaW5hbC5cbiAgICogQnkgZGVmYXVsdCBvbmx5IDMgYnV0dG9uICsgd2hlZWwgdXAvZG93biBpcyBhdGl2YXRlZC4gRm9yIGhpZ2hlciBidXR0b25zXG4gICAqIG5vIG1vdXNlIHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQuIFR5cGljYWxseSB0aGUgc3RhbmRhcmQgYWN0aW9ucyB3aWxsIGJlIGFjdGl2ZS5cbiAgICpcbiAgICogVGhlcmUgYXJlIHNldmVyYWwgcmVhc29ucyBub3QgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGhpZ2hlciBidXR0b25zL3doZWVsOlxuICAgKiAtIEJ1dHRvbiA0IGFuZCA1IGFyZSB0eXBpY2FsbHkgdXNlZCBmb3IgaGlzdG9yeSBiYWNrIGFuZCBmb3J3YXJkIG5hdmlnYXRpb24sXG4gICAqICAgdGhlcmUgaXMgbm8gc3RyYWlnaHQgZm9yd2FyZCB3YXkgdG8gc3VwcmVzcy9pbnRlcmNlcHQgdGhvc2Ugc3RhbmRhcmQgYWN0aW9ucy5cbiAgICogLSBTdXBwb3J0IGZvciBoaWdoZXIgYnV0dG9ucyBkb2VzIG5vdCB3b3JrIGluIHNvbWUgcGxhdGZvcm0vYnJvd3NlciBjb21iaW5hdGlvbnMuXG4gICAqIC0gTGVmdC9yaWdodCB3aGVlbCB3YXMgbm90IHRlc3RlZC5cbiAgICogLSBFbXVsYXRvcnMgdmFyeSBpbiBtb3VzZSBidXR0b24gc3VwcG9ydCwgdHlwaWNhbGx5IG9ubHkgMyBidXR0b25zIGFuZFxuICAgKiAgIHdoZWVsIHVwL2Rvd24gd29yayByZWxpYWJsZS5cbiAgICpcbiAgICogVE9ETzogTW92ZSBtb3VzZSBldmVudCBjb2RlIGludG8gaXRzIG93biBmaWxlLlxuICAgKi9cbiAgcHVibGljIGJpbmRNb3VzZSgpOiB2b2lkIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudCE7XG5cbiAgICAvLyBzZW5kIGV2ZW50IHRvIENvcmVNb3VzZVNlcnZpY2VcbiAgICBmdW5jdGlvbiBzZW5kRXZlbnQoZXY6IE1vdXNlRXZlbnQgfCBXaGVlbEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAvLyBnZXQgbW91c2UgY29vcmRpbmF0ZXNcbiAgICAgIGNvbnN0IHBvcyA9IHNlbGYuX21vdXNlU2VydmljZSEuZ2V0TW91c2VSZXBvcnRDb29yZHMoZXYsIHNlbGYuc2NyZWVuRWxlbWVudCEpO1xuICAgICAgaWYgKCFwb3MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBsZXQgYnV0OiBDb3JlTW91c2VCdXR0b247XG4gICAgICBsZXQgYWN0aW9uOiBDb3JlTW91c2VBY3Rpb24gfCB1bmRlZmluZWQ7XG4gICAgICBzd2l0Y2ggKChldiBhcyBhbnkpLm92ZXJyaWRlVHlwZSB8fCBldi50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgICAgICAgYWN0aW9uID0gQ29yZU1vdXNlQWN0aW9uLk1PVkU7XG4gICAgICAgICAgaWYgKGV2LmJ1dHRvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gYnV0dG9ucyBpcyBub3Qgc3VwcG9ydGVkIG9uIG1hY09TLCB0cnkgdG8gZ2V0IGEgdmFsdWUgZnJvbSBidXR0b24gaW5zdGVhZFxuICAgICAgICAgICAgYnV0ID0gQ29yZU1vdXNlQnV0dG9uLk5PTkU7XG4gICAgICAgICAgICBpZiAoZXYuYnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgYnV0ID0gZXYuYnV0dG9uIDwgMyA/IGV2LmJ1dHRvbiA6IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gTUROIGJ1dHRvbnMgb25seSByZXBvcnRzIHVwIHRvIGJ1dHRvbiA1IChBVVgyKVxuICAgICAgICAgICAgYnV0ID0gZXYuYnV0dG9ucyAmIDEgPyBDb3JlTW91c2VCdXR0b24uTEVGVCA6XG4gICAgICAgICAgICAgIGV2LmJ1dHRvbnMgJiA0ID8gQ29yZU1vdXNlQnV0dG9uLk1JRERMRSA6XG4gICAgICAgICAgICAgICAgZXYuYnV0dG9ucyAmIDIgPyBDb3JlTW91c2VCdXR0b24uUklHSFQgOlxuICAgICAgICAgICAgICAgICAgQ29yZU1vdXNlQnV0dG9uLk5PTkU7IC8vIGZhbGxiYWNrIHRvIE5PTkVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgICAgIGFjdGlvbiA9IENvcmVNb3VzZUFjdGlvbi5VUDtcbiAgICAgICAgICBidXQgPSBldi5idXR0b24gPCAzID8gZXYuYnV0dG9uIDogQ29yZU1vdXNlQnV0dG9uLk5PTkU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgYWN0aW9uID0gQ29yZU1vdXNlQWN0aW9uLkRPV047XG4gICAgICAgICAgYnV0ID0gZXYuYnV0dG9uIDwgMyA/IGV2LmJ1dHRvbiA6IENvcmVNb3VzZUJ1dHRvbi5OT05FO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd3aGVlbCc6XG4gICAgICAgICAgaWYgKHNlbGYuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyICYmIHNlbGYuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGV2IGFzIFdoZWVsRXZlbnQpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhbW91bnQgPSBzZWxmLnZpZXdwb3J0IS5nZXRMaW5lc1Njcm9sbGVkKGV2IGFzIFdoZWVsRXZlbnQpO1xuXG4gICAgICAgICAgaWYgKGFtb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFjdGlvbiA9IChldiBhcyBXaGVlbEV2ZW50KS5kZWx0YVkgPCAwID8gQ29yZU1vdXNlQWN0aW9uLlVQIDogQ29yZU1vdXNlQWN0aW9uLkRPV047XG4gICAgICAgICAgYnV0ID0gQ29yZU1vdXNlQnV0dG9uLldIRUVMO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvbnQgaGFuZGxlIG90aGVyIGV2ZW50IHR5cGVzIGJ5IGFjY2lkZW50XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBleGl0IGlmIHdlIGNhbm5vdCBkZXRlcm1pbmUgdmFsaWQgYnV0dG9uL2FjdGlvbiB2YWx1ZXNcbiAgICAgIC8vIGRvIG5vdGhpbmcgZm9yIGhpZ2hlciBidXR0b25zIHRoYW4gd2hlZWxcbiAgICAgIGlmIChhY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBidXQgPT09IHVuZGVmaW5lZCB8fCBidXQgPiBDb3JlTW91c2VCdXR0b24uV0hFRUwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZi5jb3JlTW91c2VTZXJ2aWNlLnRyaWdnZXJNb3VzZUV2ZW50KHtcbiAgICAgICAgY29sOiBwb3MuY29sLFxuICAgICAgICByb3c6IHBvcy5yb3csXG4gICAgICAgIHg6IHBvcy54LFxuICAgICAgICB5OiBwb3MueSxcbiAgICAgICAgYnV0dG9uOiBidXQsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY3RybDogZXYuY3RybEtleSxcbiAgICAgICAgYWx0OiBldi5hbHRLZXksXG4gICAgICAgIHNoaWZ0OiBldi5zaGlmdEtleVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXZlbnQgbGlzdGVuZXIgc3RhdGUgaGFuZGxpbmcuXG4gICAgICogV2UgbGlzdGVuIHRvIHRoZSBvblByb3RvY29sQ2hhbmdlIGV2ZW50IG9mIENvcmVNb3VzZVNlcnZpY2UgYW5kIHB1dFxuICAgICAqIHJlcXVlc3RlZCBsaXN0ZW5lcnMgaW4gYHJlcXVlc3RlZEV2ZW50c2AuIFdpdGggdGhpcyB0aGUgbGlzdGVuZXJzXG4gICAgICogaGF2ZSBhbGwgYml0cyB0byBkbyB0aGUgZXZlbnQgbGlzdGVuZXIganVnZ2xpbmcuXG4gICAgICogTm90ZTogJ21vdXNlZG93bicgY3VycmVudGx5IGlzIFwiYWx3YXlzIG9uXCIgYW5kIG5vdCBtYW5hZ2VkXG4gICAgICogYnkgb25Qcm90b2NvbENoYW5nZS5cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0ZWRFdmVudHM6IHsgW2tleTogc3RyaW5nXTogKChldjogRXZlbnQpID0+IHZvaWQpIHwgbnVsbCB9ID0ge1xuICAgICAgbW91c2V1cDogbnVsbCxcbiAgICAgIHdoZWVsOiBudWxsLFxuICAgICAgbW91c2VkcmFnOiBudWxsLFxuICAgICAgbW91c2Vtb3ZlOiBudWxsXG4gICAgfTtcbiAgICBjb25zdCBldmVudExpc3RlbmVyczogeyBba2V5OiBzdHJpbmddOiAoZXY6IGFueSkgPT4gdm9pZCB8IGJvb2xlYW4gfSA9IHtcbiAgICAgIG1vdXNldXA6IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICBpZiAoIWV2LmJ1dHRvbnMpIHtcbiAgICAgICAgICAvLyBpZiBubyBvdGhlciBidXR0b24gaXMgaGVsZCByZW1vdmUgZ2xvYmFsIGhhbmRsZXJzXG4gICAgICAgICAgdGhpcy5fZG9jdW1lbnQhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCByZXF1ZXN0ZWRFdmVudHMubW91c2V1cCEpO1xuICAgICAgICAgIGlmIChyZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnKSB7XG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudCEucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNlZHJhZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldik7XG4gICAgICB9LFxuICAgICAgd2hlZWw6IChldjogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYsIHRydWUpO1xuICAgICAgfSxcbiAgICAgIG1vdXNlZHJhZzogKGV2OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIC8vIGRlYWwgb25seSB3aXRoIG1vdmUgd2hpbGUgYSBidXR0b24gaXMgaGVsZFxuICAgICAgICBpZiAoZXYuYnV0dG9ucykge1xuICAgICAgICAgIHNlbmRFdmVudChldik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtb3VzZW1vdmU6IChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICAvLyBkZWFsIG9ubHkgd2l0aCBtb3ZlIHdpdGhvdXQgYW55IGJ1dHRvblxuICAgICAgICBpZiAoIWV2LmJ1dHRvbnMpIHtcbiAgICAgICAgICBzZW5kRXZlbnQoZXYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuY29yZU1vdXNlU2VydmljZS5vblByb3RvY29sQ2hhbmdlKGV2ZW50cyA9PiB7XG4gICAgICAvLyBhcHBseSBnbG9iYWwgY2hhbmdlcyBvbiBldmVudHNcbiAgICAgIGlmIChldmVudHMpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sb2dMZXZlbCA9PT0gJ2RlYnVnJykge1xuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ0JpbmRpbmcgdG8gbW91c2UgZXZlbnRzOicsIHRoaXMuY29yZU1vdXNlU2VydmljZS5leHBsYWluRXZlbnRzKGV2ZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LmFkZCgnZW5hYmxlLW1vdXNlLWV2ZW50cycpO1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5kaXNhYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmJpbmRpbmcgZnJvbSBtb3VzZSBldmVudHMuJyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCEuY2xhc3NMaXN0LnJlbW92ZSgnZW5hYmxlLW1vdXNlLWV2ZW50cycpO1xuICAgICAgICB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5lbmFibGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkL3JlbW92ZSBoYW5kbGVycyBmcm9tIHJlcXVlc3RlZEV2ZW50c1xuXG4gICAgICBpZiAoIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuTU9WRSkpIHtcbiAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNlbW92ZSEpO1xuICAgICAgICByZXF1ZXN0ZWRFdmVudHMubW91c2Vtb3ZlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAoIXJlcXVlc3RlZEV2ZW50cy5tb3VzZW1vdmUpIHtcbiAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZXZlbnRMaXN0ZW5lcnMubW91c2Vtb3ZlKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNlbW92ZSA9IGV2ZW50TGlzdGVuZXJzLm1vdXNlbW92ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMKSkge1xuICAgICAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHJlcXVlc3RlZEV2ZW50cy53aGVlbCEpO1xuICAgICAgICByZXF1ZXN0ZWRFdmVudHMud2hlZWwgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghcmVxdWVzdGVkRXZlbnRzLndoZWVsKSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgZXZlbnRMaXN0ZW5lcnMud2hlZWwsIHsgcGFzc2l2ZTogZmFsc2UgfSk7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy53aGVlbCA9IGV2ZW50TGlzdGVuZXJzLndoZWVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuVVApKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50IS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAhKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICghcmVxdWVzdGVkRXZlbnRzLm1vdXNldXApIHtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXAgPSBldmVudExpc3RlbmVycy5tb3VzZXVwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuRFJBRykpIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWchKTtcbiAgICAgICAgcmVxdWVzdGVkRXZlbnRzLm1vdXNlZHJhZyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCFyZXF1ZXN0ZWRFdmVudHMubW91c2VkcmFnKSB7XG4gICAgICAgIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcgPSBldmVudExpc3RlbmVycy5tb3VzZWRyYWc7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIC8vIGZvcmNlIGluaXRpYWwgb25Qcm90b2NvbENoYW5nZSBzbyB3ZSBkb250IG1pc3MgZWFybHkgbW91c2UgcmVxdWVzdHNcbiAgICB0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSB0aGlzLmNvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2w7XG5cbiAgICAvKipcbiAgICAgKiBcIkFsd2F5cyBvblwiIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgKi9cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihlbCwgJ21vdXNlZG93bicsIChldjogTW91c2VFdmVudCkgPT4ge1xuICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuZm9jdXMoKTtcblxuICAgICAgLy8gRG9uJ3Qgc2VuZCB0aGUgbW91c2UgYnV0dG9uIHRvIHRoZSBwdHkgaWYgbW91c2UgZXZlbnRzIGFyZSBkaXNhYmxlZCBvclxuICAgICAgLy8gaWYgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIGlzIGhhdmluZyBzZWxlY3Rpb24gZm9yY2VkIChpZS4gYSBtb2RpZmllciBpc1xuICAgICAgLy8gaGVsZCkuXG4gICAgICBpZiAoIXRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSB8fCB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlIS5zaG91bGRGb3JjZVNlbGVjdGlvbihldikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZW5kRXZlbnQoZXYpO1xuXG4gICAgICAvLyBSZWdpc3RlciBhZGRpdGlvbmFsIGdsb2JhbCBoYW5kbGVycyB3aGljaCBzaG91bGQga2VlcCByZXBvcnRpbmcgb3V0c2lkZVxuICAgICAgLy8gb2YgdGhlIHRlcm1pbmFsIGVsZW1lbnQuXG4gICAgICAvLyBOb3RlOiBPdGhlciBlbXVsYXRvcnMgYWxzbyBkbyB0aGlzIGZvciAnbW91c2Vkb3duJyB3aGlsZSBhIGJ1dHRvblxuICAgICAgLy8gaXMgaGVsZCwgd2UgY3VycmVudGx5IGxpbWl0ICdtb3VzZWRvd24nIHRvIHRoZSB0ZXJtaW5hbCBvbmx5LlxuICAgICAgaWYgKHJlcXVlc3RlZEV2ZW50cy5tb3VzZXVwKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50IS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgcmVxdWVzdGVkRXZlbnRzLm1vdXNldXApO1xuICAgICAgfVxuICAgICAgaWYgKHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcpIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQhLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHJlcXVlc3RlZEV2ZW50cy5tb3VzZWRyYWcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYpO1xuICAgIH0pKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKGVsLCAnd2hlZWwnLCAoZXY6IFdoZWVsRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvIG5vdGhpbmcsIGlmIGFwcCBzaWRlIGhhbmRsZXMgd2hlZWwgaXRzZWxmXG4gICAgICBpZiAocmVxdWVzdGVkRXZlbnRzLndoZWVsKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlciAmJiB0aGlzLl9jdXN0b21XaGVlbEV2ZW50SGFuZGxlcihldikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmJ1ZmZlci5oYXNTY3JvbGxiYWNrKSB7XG4gICAgICAgIC8vIENvbnZlcnQgd2hlZWwgZXZlbnRzIGludG8gdXAvZG93biBldmVudHMgd2hlbiB0aGUgYnVmZmVyIGRvZXMgbm90IGhhdmUgc2Nyb2xsYmFjaywgdGhpc1xuICAgICAgICAvLyBlbmFibGVzIHNjcm9sbGluZyBpbiBhcHBzIGhvc3RlZCBpbiB0aGUgYWx0IGJ1ZmZlciBzdWNoIGFzIHZpbSBvciB0bXV4LlxuICAgICAgICBjb25zdCBhbW91bnQgPSB0aGlzLnZpZXdwb3J0IS5nZXRMaW5lc1Njcm9sbGVkKGV2KTtcblxuICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlJ3Mgbm8gdmVydGljYWwgc2Nyb2xsXG4gICAgICAgIGlmIChhbW91bnQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYW5kIHNlbmQgc2VxdWVuY2VzXG4gICAgICAgIGNvbnN0IHNlcXVlbmNlID0gQzAuRVNDICsgKHRoaXMuY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cyA/ICdPJyA6ICdbJykgKyAoZXYuZGVsdGFZIDwgMCA/ICdBJyA6ICdCJyk7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5hYnMoYW1vdW50KTsgaSsrKSB7XG4gICAgICAgICAgZGF0YSArPSBzZXF1ZW5jZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoZGF0YSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldiwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vcm1hbCB2aWV3cG9ydCBzY3JvbGxpbmdcbiAgICAgIC8vIGNvbmRpdGlvbmFsbHkgc3RvcCBldmVudCwgaWYgdGhlIHZpZXdwb3J0IHN0aWxsIGhhZCByb3dzIHRvIHNjcm9sbCB3aXRoaW5cbiAgICAgIGlmICh0aGlzLnZpZXdwb3J0IS5oYW5kbGVXaGVlbChldikpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2KTtcbiAgICAgIH1cbiAgICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoYWRkRGlzcG9zYWJsZURvbUxpc3RlbmVyKGVsLCAndG91Y2hzdGFydCcsIChldjogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSkgcmV0dXJuO1xuICAgICAgdGhpcy52aWV3cG9ydCEuaGFuZGxlVG91Y2hTdGFydChldik7XG4gICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYpO1xuICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcihlbCwgJ3RvdWNobW92ZScsIChldjogVG91Y2hFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY29yZU1vdXNlU2VydmljZS5hcmVNb3VzZUV2ZW50c0FjdGl2ZSkgcmV0dXJuO1xuICAgICAgaWYgKCF0aGlzLnZpZXdwb3J0IS5oYW5kbGVUb3VjaE1vdmUoZXYpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldik7XG4gICAgICB9XG4gICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBUZWxscyB0aGUgcmVuZGVyZXIgdG8gcmVmcmVzaCB0ZXJtaW5hbCBjb250ZW50IGJldHdlZW4gdHdvIHJvd3MgKGluY2x1c2l2ZSkgYXQgdGhlIG5leHRcbiAgICogb3Bwb3J0dW5pdHkuXG4gICAqIEBwYXJhbSBzdGFydCBUaGUgcm93IHRvIHN0YXJ0IGZyb20gKGJldHdlZW4gMCBhbmQgdGhpcy5yb3dzIC0gMSkuXG4gICAqIEBwYXJhbSBlbmQgVGhlIHJvdyB0byBlbmQgYXQgKGJldHdlZW4gc3RhcnQgYW5kIHRoaXMucm93cyAtIDEpLlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJTZXJ2aWNlPy5yZWZyZXNoUm93cyhzdGFydCwgZW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGN1cnNvciBzdHlsZSBmb3IgZGlmZmVyZW50IHNlbGVjdGlvbiBtb2Rlc1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZUN1cnNvclN0eWxlKGV2OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlPy5zaG91bGRDb2x1bW5TZWxlY3QoZXYpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQhLmNsYXNzTGlzdC5hZGQoJ2NvbHVtbi1zZWxlY3QnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbGVtZW50IS5jbGFzc0xpc3QucmVtb3ZlKCdjb2x1bW4tc2VsZWN0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgdGhlIGN1cnNvciBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIF9zaG93Q3Vyc29yKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb3JlU2VydmljZS5pc0N1cnNvckluaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLmlzQ3Vyc29ySW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5yZWZyZXNoKHRoaXMuYnVmZmVyLnksIHRoaXMuYnVmZmVyLnkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxMaW5lcyhkaXNwOiBudW1iZXIsIHN1cHByZXNzU2Nyb2xsRXZlbnQ/OiBib29sZWFuLCBzb3VyY2UgPSBTY3JvbGxTb3VyY2UuVEVSTUlOQUwpOiB2b2lkIHtcbiAgICBpZiAoc291cmNlID09PSBTY3JvbGxTb3VyY2UuVklFV1BPUlQpIHtcbiAgICAgIHN1cGVyLnNjcm9sbExpbmVzKGRpc3AsIHN1cHByZXNzU2Nyb2xsRXZlbnQsIHNvdXJjZSk7XG4gICAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlld3BvcnQ/LnNjcm9sbExpbmVzKGRpc3ApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXN0ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBwYXN0ZShkYXRhLCB0aGlzLnRleHRhcmVhISwgdGhpcy5jb3JlU2VydmljZSwgdGhpcy5vcHRpb25zU2VydmljZSk7XG4gIH1cblxuICBwdWJsaWMgYXR0YWNoQ3VzdG9tS2V5RXZlbnRIYW5kbGVyKGN1c3RvbUtleUV2ZW50SGFuZGxlcjogQ3VzdG9tS2V5RXZlbnRIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gY3VzdG9tS2V5RXZlbnRIYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGF0dGFjaEN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyOiBDdXN0b21XaGVlbEV2ZW50SGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX2N1c3RvbVdoZWVsRXZlbnRIYW5kbGVyID0gY3VzdG9tV2hlZWxFdmVudEhhbmRsZXI7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyOiBJTGlua1Byb3ZpZGVyKTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9saW5rUHJvdmlkZXJTZXJ2aWNlLnJlZ2lzdGVyTGlua1Byb3ZpZGVyKGxpbmtQcm92aWRlcik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoaGFuZGxlcjogQ2hhcmFjdGVySm9pbmVySGFuZGxlcik6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLl9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlcm1pbmFsIG11c3QgYmUgb3BlbmVkIGZpcnN0Jyk7XG4gICAgfVxuICAgIGNvbnN0IGpvaW5lcklkID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5yZWdpc3RlcihoYW5kbGVyKTtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgcmV0dXJuIGpvaW5lcklkO1xuICB9XG5cbiAgcHVibGljIGRlcmVnaXN0ZXJDaGFyYWN0ZXJKb2luZXIoam9pbmVySWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUZXJtaW5hbCBtdXN0IGJlIG9wZW5lZCBmaXJzdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5kZXJlZ2lzdGVyKGpvaW5lcklkKSkge1xuICAgICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFya2VycygpOiBJTWFya2VyW10ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5tYXJrZXJzO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTWFya2VyKGN1cnNvcllPZmZzZXQ6IG51bWJlcik6IElNYXJrZXIge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5hZGRNYXJrZXIodGhpcy5idWZmZXIueWJhc2UgKyB0aGlzLmJ1ZmZlci55ICsgY3Vyc29yWU9mZnNldCk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RlY29yYXRpb25TZXJ2aWNlLnJlZ2lzdGVyRGVjb3JhdGlvbihkZWNvcmF0aW9uT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBoYXMgYW4gYWN0aXZlIHNlbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvblNlcnZpY2UgPyB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLmhhc1NlbGVjdGlvbiA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGV4dCB3aXRoaW4gdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gdGhlIHNlbGVjdGlvbiBzdGFydHMgYXQuLlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgdGhlIHNlbGVjdGlvbiBzdGFydHMgYXQuXG4gICAqIEBwYXJhbSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHNlbGVjdChjb2x1bW46IG51bWJlciwgcm93OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZSEuc2V0U2VsZWN0aW9uKGNvbHVtbiwgcm93LCBsZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRlcm1pbmFsJ3MgY3VycmVudCBzZWxlY3Rpb24sIHRoaXMgaXMgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgY29weVxuICAgKiBiZWhhdmlvciBvdXRzaWRlIG9mIHh0ZXJtLmpzLlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlID8gdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25UZXh0IDogJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0aW9uUG9zaXRpb24oKTogSUJ1ZmZlclJhbmdlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGlvblNlcnZpY2UgfHwgIXRoaXMuX3NlbGVjdGlvblNlcnZpY2UuaGFzU2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDoge1xuICAgICAgICB4OiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvblN0YXJ0IVswXSxcbiAgICAgICAgeTogdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25TdGFydCFbMV1cbiAgICAgIH0sXG4gICAgICBlbmQ6IHtcbiAgICAgICAgeDogdGhpcy5fc2VsZWN0aW9uU2VydmljZS5zZWxlY3Rpb25FbmQhWzBdLFxuICAgICAgICB5OiB0aGlzLl9zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdGlvbkVuZCFbMV1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCB0ZXJtaW5hbCBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZT8uY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIGFsbCB0ZXh0IHdpdGhpbiB0aGUgdGVybWluYWwuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnNlbGVjdEFsbCgpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdExpbmVzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU2VydmljZT8uc2VsZWN0TGluZXMoc3RhcnQsIGVuZCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEga2V5ZG93biBbS2V5Ym9hcmRFdmVudF0uXG4gICAqXG4gICAqIFtLZXlib2FyZEV2ZW50XTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vS2V5Ym9hcmRFdmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIF9rZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5fa2V5RG93bkhhbmRsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9rZXlEb3duU2VlbiA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyICYmIHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlcihldmVudCkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWdub3JlIGNvbXBvc2luZyB3aXRoIEFsdCBrZXkgb24gTWFjIHdoZW4gbWFjT3B0aW9uSXNNZXRhIGlzIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRJZ25vcmVDb21wb3NpdGlvbiA9IHRoaXMuYnJvd3Nlci5pc01hYyAmJiB0aGlzLm9wdGlvbnMubWFjT3B0aW9uSXNNZXRhICYmIGV2ZW50LmFsdEtleTtcblxuICAgIGlmICghc2hvdWxkSWdub3JlQ29tcG9zaXRpb24gJiYgIXRoaXMuX2NvbXBvc2l0aW9uSGVscGVyIS5rZXlkb3duKGV2ZW50KSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY3JvbGxPblVzZXJJbnB1dCAmJiB0aGlzLmJ1ZmZlci55YmFzZSAhPT0gdGhpcy5idWZmZXIueWRpc3ApIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghc2hvdWxkSWdub3JlQ29tcG9zaXRpb24gJiYgKGV2ZW50LmtleSA9PT0gJ0RlYWQnIHx8IGV2ZW50LmtleSA9PT0gJ0FsdEdyYXBoJykpIHtcbiAgICAgIHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gZXZhbHVhdGVLZXlib2FyZEV2ZW50KGV2ZW50LCB0aGlzLmNvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMsIHRoaXMuYnJvd3Nlci5pc01hYywgdGhpcy5vcHRpb25zLm1hY09wdGlvbklzTWV0YSk7XG5cbiAgICB0aGlzLnVwZGF0ZUN1cnNvclN0eWxlKGV2ZW50KTtcblxuICAgIGlmIChyZXN1bHQudHlwZSA9PT0gS2V5Ym9hcmRSZXN1bHRUeXBlLlBBR0VfRE9XTiB8fCByZXN1bHQudHlwZSA9PT0gS2V5Ym9hcmRSZXN1bHRUeXBlLlBBR0VfVVApIHtcbiAgICAgIGNvbnN0IHNjcm9sbENvdW50ID0gdGhpcy5yb3dzIC0gMTtcbiAgICAgIHRoaXMuc2Nyb2xsTGluZXMocmVzdWx0LnR5cGUgPT09IEtleWJvYXJkUmVzdWx0VHlwZS5QQUdFX1VQID8gLXNjcm9sbENvdW50IDogc2Nyb2xsQ291bnQpO1xuICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsKGV2ZW50LCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgPT09IEtleWJvYXJkUmVzdWx0VHlwZS5TRUxFQ1RfQUxMKSB7XG4gICAgICB0aGlzLnNlbGVjdEFsbCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLmJyb3dzZXIsIGV2ZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5jYW5jZWwpIHtcbiAgICAgIC8vIFRoZSBldmVudCBpcyBjYW5jZWxlZCBhdCB0aGUgZW5kIGFscmVhZHksIGlzIHRoaXMgbmVjZXNzYXJ5P1xuICAgICAgdGhpcy5jYW5jZWwoZXZlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICghcmVzdWx0LmtleSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSEFDSzogUHJvY2VzcyBBLVogaW4gdGhlIGtleXByZXNzIGV2ZW50IHRvIGZpeCBhbiBpc3N1ZSB3aXRoIG1hY09TIElNRXMgd2hlcmUgbG93ZXIgY2FzZVxuICAgIC8vIGxldHRlcnMgY2Fubm90IGJlIGlucHV0IHdoaWxlIGNhcHMgbG9jayBpcyBvbi5cbiAgICBpZiAoZXZlbnQua2V5ICYmICFldmVudC5jdHJsS2V5ICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgaWYgKGV2ZW50LmtleS5jaGFyQ29kZUF0KDApID49IDY1ICYmIGV2ZW50LmtleS5jaGFyQ29kZUF0KDApIDw9IDkwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkpIHtcbiAgICAgIHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgY3RybCtjIG9yIGVudGVyIGlzIGJlaW5nIHNlbnQsIGNsZWFyIG91dCB0aGUgdGV4dGFyZWEuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHNjcmVlbiByZWFkZXJzXG4gICAgLy8gd2lsbCBhbm5vdW5jZSBkZWxldGVkIGNoYXJhY3RlcnMuIFRoaXMgd2lsbCBub3Qgd29yayAxMDAlIG9mIHRoZSB0aW1lIGJ1dCBpdCBzaG91bGQgY292ZXJcbiAgICAvLyBtb3N0IHNjZW5hcmlvcy5cbiAgICBpZiAocmVzdWx0LmtleSA9PT0gQzAuRVRYIHx8IHJlc3VsdC5rZXkgPT09IEMwLkNSKSB7XG4gICAgICB0aGlzLnRleHRhcmVhIS52YWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIHRoaXMuX29uS2V5LmZpcmUoeyBrZXk6IHJlc3VsdC5rZXksIGRvbUV2ZW50OiBldmVudCB9KTtcbiAgICB0aGlzLl9zaG93Q3Vyc29yKCk7XG4gICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KHJlc3VsdC5rZXksIHRydWUpO1xuXG4gICAgLy8gQ2FuY2VsIGV2ZW50cyB3aGVuIG5vdCBpbiBzY3JlZW4gcmVhZGVyIG1vZGUgc28gZXZlbnRzIGRvbid0IGdldCBidWJibGVkIHVwIGFuZCBoYW5kbGVkIGJ5XG4gICAgLy8gb3RoZXIgbGlzdGVuZXJzLiBXaGVuIHNjcmVlbiByZWFkZXIgbW9kZSBpcyBlbmFibGVkLCB3ZSBkb24ndCBjYW5jZWwgdGhlbSAodW5sZXNzIGN0cmwgb3IgYWx0XG4gICAgLy8gaXMgYWxzbyBkZXByZXNzZWQpIHNvIHRoYXQgdGhlIGN1cnNvciB0ZXh0YXJlYSBjYW4gYmUgdXBkYXRlZCwgd2hpY2ggdHJpZ2dlcnMgdGhlIHNjcmVlblxuICAgIC8vIHJlYWRlciB0byByZWFkIGl0LlxuICAgIGlmICghdGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldmVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fa2V5RG93bkhhbmRsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNUaGlyZExldmVsU2hpZnQoYnJvd3NlcjogSUJyb3dzZXIsIGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdGhpcmRMZXZlbEtleSA9XG4gICAgICAoYnJvd3Nlci5pc01hYyAmJiAhdGhpcy5vcHRpb25zLm1hY09wdGlvbklzTWV0YSAmJiBldi5hbHRLZXkgJiYgIWV2LmN0cmxLZXkgJiYgIWV2Lm1ldGFLZXkpIHx8XG4gICAgICAoYnJvd3Nlci5pc1dpbmRvd3MgJiYgZXYuYWx0S2V5ICYmIGV2LmN0cmxLZXkgJiYgIWV2Lm1ldGFLZXkpIHx8XG4gICAgICAoYnJvd3Nlci5pc1dpbmRvd3MgJiYgZXYuZ2V0TW9kaWZpZXJTdGF0ZSgnQWx0R3JhcGgnKSk7XG5cbiAgICBpZiAoZXYudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIHRoaXJkTGV2ZWxLZXk7XG4gICAgfVxuXG4gICAgLy8gRG9uJ3QgaW52b2tlIGZvciBhcnJvd3MsIHBhZ2VEb3duLCBob21lLCBiYWNrc3BhY2UsIGV0Yy4gKG9uIG5vbi1rZXlwcmVzcyBldmVudHMpXG4gICAgcmV0dXJuIHRoaXJkTGV2ZWxLZXkgJiYgKCFldi5rZXlDb2RlIHx8IGV2LmtleUNvZGUgPiA0Nyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2tleVVwKGV2OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fa2V5RG93blNlZW4gPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgJiYgdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyKGV2KSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXdhc01vZGlmaWVyS2V5T25seUV2ZW50KGV2KSkge1xuICAgICAgdGhpcy5mb2N1cygpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlQ3Vyc29yU3R5bGUoZXYpO1xuICAgIHRoaXMuX2tleVByZXNzSGFuZGxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGtleXByZXNzIGV2ZW50LlxuICAgKiBLZXkgUmVzb3VyY2VzOlxuICAgKiAgIC0gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9ET00vS2V5Ym9hcmRFdmVudFxuICAgKiBAcGFyYW0gZXYgVGhlIGtleXByZXNzIGV2ZW50IHRvIGJlIGhhbmRsZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2tleVByZXNzKGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgbGV0IGtleTtcblxuICAgIHRoaXMuX2tleVByZXNzSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKHRoaXMuX2tleURvd25IYW5kbGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1c3RvbUtleUV2ZW50SGFuZGxlciAmJiB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIoZXYpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsKGV2KTtcblxuICAgIGlmIChldi5jaGFyQ29kZSkge1xuICAgICAga2V5ID0gZXYuY2hhckNvZGU7XG4gICAgfSBlbHNlIGlmIChldi53aGljaCA9PT0gbnVsbCB8fCBldi53aGljaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBrZXkgPSBldi5rZXlDb2RlO1xuICAgIH0gZWxzZSBpZiAoZXYud2hpY2ggIT09IDAgJiYgZXYuY2hhckNvZGUgIT09IDApIHtcbiAgICAgIGtleSA9IGV2LndoaWNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFrZXkgfHwgKFxuICAgICAgKGV2LmFsdEtleSB8fCBldi5jdHJsS2V5IHx8IGV2Lm1ldGFLZXkpICYmICF0aGlzLl9pc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLmJyb3dzZXIsIGV2KVxuICAgICkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleSk7XG5cbiAgICB0aGlzLl9vbktleS5maXJlKHsga2V5LCBkb21FdmVudDogZXYgfSk7XG4gICAgdGhpcy5fc2hvd0N1cnNvcigpO1xuICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChrZXksIHRydWUpO1xuXG4gICAgdGhpcy5fa2V5UHJlc3NIYW5kbGVkID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBrZXkgd2FzIGhhbmRsZWQgc28gY2xlYXIgdGhlIGRlYWQga2V5IHN0YXRlLCBvdGhlcndpc2UgY2VydGFpbiBrZXlzdHJva2VzIGxpa2UgYXJyb3dcbiAgICAvLyBrZXlzIGNvdWxkIGJlIGlnbm9yZWRcbiAgICB0aGlzLl91bnByb2Nlc3NlZERlYWRLZXkgPSBmYWxzZTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhbiBpbnB1dCBldmVudC5cbiAgICogS2V5IFJlc291cmNlczpcbiAgICogICAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JbnB1dEV2ZW50XG4gICAqIEBwYXJhbSBldiBUaGUgaW5wdXQgZXZlbnQgdG8gYmUgaGFuZGxlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfaW5wdXRFdmVudChldjogSW5wdXRFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIE9ubHkgc3VwcG9ydCBlbW9qaSBJTUVzIHdoZW4gc2NyZWVuIHJlYWRlciBtb2RlIGlzIGRpc2FibGVkIGFzIHRoZSBldmVudCBtdXN0IGJ1YmJsZSB1cCB0b1xuICAgIC8vIHN1cHBvcnQgcmVhZGluZyBvdXQgY2hhcmFjdGVyIGlucHV0IHdoaWNoIGNhbiBkb3VibGluZyB1cCBpbnB1dCBjaGFyYWN0ZXJzXG4gICAgLy8gQmFzZWQgb24gdGhlc2UgZXZlbnQgdHJhY2VzOiBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9pc3N1ZXMvMzY3OVxuICAgIGlmIChldi5kYXRhICYmIGV2LmlucHV0VHlwZSA9PT0gJ2luc2VydFRleHQnICYmICghZXYuY29tcG9zZWQgfHwgIXRoaXMuX2tleURvd25TZWVuKSAmJiAhdGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUpIHtcbiAgICAgIGlmICh0aGlzLl9rZXlQcmVzc0hhbmRsZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUga2V5IHdhcyBoYW5kbGVkIHNvIGNsZWFyIHRoZSBkZWFkIGtleSBzdGF0ZSwgb3RoZXJ3aXNlIGNlcnRhaW4ga2V5c3Ryb2tlcyBsaWtlIGFycm93XG4gICAgICAvLyBrZXlzIGNvdWxkIGJlIGlnbm9yZWRcbiAgICAgIHRoaXMuX3VucHJvY2Vzc2VkRGVhZEtleSA9IGZhbHNlO1xuXG4gICAgICBjb25zdCB0ZXh0ID0gZXYuZGF0YTtcbiAgICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudCh0ZXh0LCB0cnVlKTtcblxuICAgICAgdGhpcy5jYW5jZWwoZXYpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZXMgdGhlIHRlcm1pbmFsLlxuICAgKlxuICAgKiBAcGFyYW0geCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgdG8gcmVzaXplIHRvLlxuICAgKiBAcGFyYW0geSBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gcmVzaXplIHRvLlxuICAgKi9cbiAgcHVibGljIHJlc2l6ZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh4ID09PSB0aGlzLmNvbHMgJiYgeSA9PT0gdGhpcy5yb3dzKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBzdGlsbCBuZWVkIHRvIG1lYXN1cmUgdGhlIGNoYXIgc2l6ZSAoZml4ZXMgIzc4NSkuXG4gICAgICBpZiAodGhpcy5fY2hhclNpemVTZXJ2aWNlICYmICF0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGFzVmFsaWRTaXplKSB7XG4gICAgICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VwZXIucmVzaXplKHgsIHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWZ0ZXJSZXNpemUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFyU2l6ZVNlcnZpY2U/Lm1lYXN1cmUoKTtcblxuICAgIC8vIFN5bmMgdGhlIHNjcm9sbCBhcmVhIHRvIG1ha2Ugc3VyZSBzY3JvbGwgZXZlbnRzIGRvbid0IGZpcmUgYW5kIHNjcm9sbCB0aGUgdmlld3BvcnQgdG8gYW5cbiAgICAvLyBpbnZhbGlkIGxvY2F0aW9uXG4gICAgdGhpcy52aWV3cG9ydD8uc3luY1Njcm9sbEFyZWEodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGVudGlyZSBidWZmZXIsIG1ha2luZyB0aGUgcHJvbXB0IGxpbmUgdGhlIG5ldyBmaXJzdCBsaW5lLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJ1ZmZlci55YmFzZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci55ID09PSAwKSB7XG4gICAgICAvLyBEb24ndCBjbGVhciBpZiBpdCdzIGFscmVhZHkgY2xlYXJcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5idWZmZXIuY2xlYXJBbGxNYXJrZXJzKCk7XG4gICAgdGhpcy5idWZmZXIubGluZXMuc2V0KDAsIHRoaXMuYnVmZmVyLmxpbmVzLmdldCh0aGlzLmJ1ZmZlci55YmFzZSArIHRoaXMuYnVmZmVyLnkpISk7XG4gICAgdGhpcy5idWZmZXIubGluZXMubGVuZ3RoID0gMTtcbiAgICB0aGlzLmJ1ZmZlci55ZGlzcCA9IDA7XG4gICAgdGhpcy5idWZmZXIueWJhc2UgPSAwO1xuICAgIHRoaXMuYnVmZmVyLnkgPSAwO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgIHRoaXMuYnVmZmVyLmxpbmVzLnB1c2godGhpcy5idWZmZXIuZ2V0QmxhbmtMaW5lKERFRkFVTFRfQVRUUl9EQVRBKSk7XG4gICAgfVxuICAgIC8vIElNUE9SVEFOVDogRmlyZSBzY3JvbGwgZXZlbnQgYmVmb3JlIHZpZXdwb3J0IGlzIHJlc2V0LiBUaGlzIGVuc3VyZXMgZW1iZWRkZXJzIGdldCB0aGUgY2xlYXJcbiAgICAvLyBzY3JvbGwgZXZlbnQgYW5kIHRoYXQgdGhlIHZpZXdwb3J0J3Mgc3RhdGUgd2lsbCBiZSB2YWxpZCBmb3IgaW1tZWRpYXRlIHdyaXRlcy5cbiAgICB0aGlzLl9vblNjcm9sbC5maXJlKHsgcG9zaXRpb246IHRoaXMuYnVmZmVyLnlkaXNwLCBzb3VyY2U6IFNjcm9sbFNvdXJjZS5URVJNSU5BTCB9KTtcbiAgICB0aGlzLnZpZXdwb3J0Py5yZXNldCgpO1xuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0ZXJtaW5hbC5cbiAgICogTm90ZTogQ2FsbGluZyB0aGlzIGRpcmVjdGx5IGZyb20gSlMgaXMgc3luY2hyb25vdXMgYnV0IGRvZXMgbm90IGNsZWFyXG4gICAqIGlucHV0IGJ1ZmZlcnMgYW5kIGRvZXMgbm90IHJlc2V0IHRoZSBwYXJzZXIsIHRodXMgdGhlIHRlcm1pbmFsIHdpbGxcbiAgICogY29udGludWUgdG8gYXBwbHkgcGVuZGluZyBpbnB1dCBkYXRhLlxuICAgKiBJZiB5b3UgbmVlZCBpbiBiYW5kIHJlc2V0IChzeW5jaHJvbm91cyB3aXRoIGlucHV0IGRhdGEpIGNvbnNpZGVyXG4gICAqIHVzaW5nIERFQ1NUUiAoc29mdCByZXNldCwgQ1NJICEgcCkgb3IgUklTIGluc3RlYWQgKGhhcmQgcmVzZXQsIEVTQyBjKS5cbiAgICovXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAvKipcbiAgICAgKiBTaW5jZSBfc2V0dXAgaGFuZGxlcyBhIGZ1bGwgdGVybWluYWwgY3JlYXRpb24sIHdlIGhhdmUgdG8gY2FycnkgZm9yd2FyZFxuICAgICAqIGEgZmV3IHRoaW5ncyB0aGF0IHNob3VsZCBub3QgcmVzZXQuXG4gICAgICovXG4gICAgdGhpcy5vcHRpb25zLnJvd3MgPSB0aGlzLnJvd3M7XG4gICAgdGhpcy5vcHRpb25zLmNvbHMgPSB0aGlzLmNvbHM7XG4gICAgY29uc3QgY3VzdG9tS2V5RXZlbnRIYW5kbGVyID0gdGhpcy5fY3VzdG9tS2V5RXZlbnRIYW5kbGVyO1xuXG4gICAgdGhpcy5fc2V0dXAoKTtcbiAgICBzdXBlci5yZXNldCgpO1xuICAgIHRoaXMuX3NlbGVjdGlvblNlcnZpY2U/LnJlc2V0KCk7XG4gICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLnZpZXdwb3J0Py5yZXNldCgpO1xuXG4gICAgLy8gcmVhdHRhY2hcbiAgICB0aGlzLl9jdXN0b21LZXlFdmVudEhhbmRsZXIgPSBjdXN0b21LZXlFdmVudEhhbmRsZXI7XG5cbiAgICAvLyBkbyBhIGZ1bGwgc2NyZWVuIHJlZnJlc2hcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyU2VydmljZT8uY2xlYXJUZXh0dXJlQXRsYXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydEZvY3VzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygnZm9jdXMnKSkge1xuICAgICAgdGhpcy5jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbSScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1tPJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVwb3J0V2luZG93c09wdGlvbnModHlwZTogV2luZG93c09wdGlvbnNSZXBvcnRUeXBlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJTZXJ2aWNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfV0lOX1NJWkVfUElYRUxTOlxuICAgICAgICBjb25zdCBjYW52YXNXaWR0aCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoLnRvRml4ZWQoMCk7XG4gICAgICAgIGNvbnN0IGNhbnZhc0hlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodC50b0ZpeGVkKDApO1xuICAgICAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVs0OyR7Y2FudmFzSGVpZ2h0fTske2NhbnZhc1dpZHRofXRgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfQ0VMTF9TSVpFX1BJWEVMUzpcbiAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLnRvRml4ZWQoMCk7XG4gICAgICAgIGNvbnN0IGNlbGxIZWlnaHQgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0LnRvRml4ZWQoMCk7XG4gICAgICAgIHRoaXMuY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9WzY7JHtjZWxsSGVpZ2h0fTske2NlbGxXaWR0aH10YCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE86IFJlbW92ZSBjYW5jZWwgZnVuY3Rpb24gYW5kIGNhbmNlbEV2ZW50cyBvcHRpb25cbiAgcHVibGljIGNhbmNlbChldjogRXZlbnQsIGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5vcHRpb25zLmNhbmNlbEV2ZW50cyAmJiAhZm9yY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXJzXG4gKi9cblxuZnVuY3Rpb24gd2FzTW9kaWZpZXJLZXlPbmx5RXZlbnQoZXY6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGV2LmtleUNvZGUgPT09IDE2IHx8IC8vIFNoaWZ0XG4gICAgZXYua2V5Q29kZSA9PT0gMTcgfHwgLy8gQ3RybFxuICAgIGV2LmtleUNvZGUgPT09IDE4OyAvLyBBbHRcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuY29uc3QgUkVOREVSX0RFQk9VTkNFX1RIUkVTSE9MRF9NUyA9IDEwMDA7IC8vIDEgU2Vjb25kXG5cbmltcG9ydCB7IElSZW5kZXJEZWJvdW5jZXIgfSBmcm9tICdicm93c2VyL1R5cGVzJztcblxuLyoqXG4gKiBEZWJvdW5jZXMgY2FsbHMgdG8gdXBkYXRlIHNjcmVlbiByZWFkZXJzIHRvIHVwZGF0ZSBhdCBtb3N0IG9uY2UgY29uZmlndXJhYmxlIGludGVydmFsIG9mIHRpbWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lQmFzZWREZWJvdW5jZXIgaW1wbGVtZW50cyBJUmVuZGVyRGVib3VuY2VyIHtcbiAgcHJpdmF0ZSBfcm93U3RhcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcm93RW5kOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3Jvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLy8gVGhlIGxhc3QgbW9tZW50IHRoYXQgdGhlIFRlcm1pbmFsIHdhcyByZWZyZXNoZWQgYXRcbiAgcHJpdmF0ZSBfbGFzdFJlZnJlc2hNcyA9IDA7XG4gIC8vIFdoZXRoZXIgYSB0cmFpbGluZyByZWZyZXNoIHNob3VsZCBiZSB0cmlnZ2VyZWQgZHVlIHRvIGEgcmVmcmVzaCByZXF1ZXN0IHRoYXQgd2FzIHRocm90dGxlZFxuICBwcml2YXRlIF9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3JlZnJlc2hUaW1lb3V0SUQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJDYWxsYmFjazogKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlYm91bmNlVGhyZXNob2xkTVMgPSBSRU5ERVJfREVCT1VOQ0VfVEhSRVNIT0xEX01TXG4gICkge1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3JlZnJlc2hUaW1lb3V0SUQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZWZyZXNoVGltZW91dElEKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaChyb3dTdGFydDogbnVtYmVyIHwgdW5kZWZpbmVkLCByb3dFbmQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcm93Q291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3Jvd0NvdW50ID0gcm93Q291bnQ7XG4gICAgLy8gR2V0IHRoZSBtaW4vbWF4IHJvdyBzdGFydC9lbmQgZm9yIHRoZSBhcmcgdmFsdWVzXG4gICAgcm93U3RhcnQgPSByb3dTdGFydCAhPT0gdW5kZWZpbmVkID8gcm93U3RhcnQgOiAwO1xuICAgIHJvd0VuZCA9IHJvd0VuZCAhPT0gdW5kZWZpbmVkID8gcm93RW5kIDogdGhpcy5fcm93Q291bnQgLSAxO1xuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyB0byB0aGUgdXBkYXRlZCB2YWx1ZXNcbiAgICB0aGlzLl9yb3dTdGFydCA9IHRoaXMuX3Jvd1N0YXJ0ICE9PSB1bmRlZmluZWQgPyBNYXRoLm1pbih0aGlzLl9yb3dTdGFydCwgcm93U3RhcnQpIDogcm93U3RhcnQ7XG4gICAgdGhpcy5fcm93RW5kID0gdGhpcy5fcm93RW5kICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCh0aGlzLl9yb3dFbmQsIHJvd0VuZCkgOiByb3dFbmQ7XG5cbiAgICAvLyBPbmx5IHJlZnJlc2ggaWYgdGhlIHRpbWUgc2luY2UgbGFzdCByZWZyZXNoIGlzIGFib3ZlIGEgdGhyZXNob2xkLCBvdGhlcndpc2Ugd2FpdCBmb3JcbiAgICAvLyBlbm91Z2ggdGltZSB0byBwYXNzIGJlZm9yZSByZWZyZXNoaW5nIGFnYWluLlxuICAgIGNvbnN0IHJlZnJlc2hSZXF1ZXN0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICBpZiAocmVmcmVzaFJlcXVlc3RUaW1lIC0gdGhpcy5fbGFzdFJlZnJlc2hNcyA+PSB0aGlzLl9kZWJvdW5jZVRocmVzaG9sZE1TKSB7XG4gICAgICAvLyBFbm91Z2ggdGltZSBoYXMgbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHJlZnJlc2g7IHJlZnJlc2ggaW1tZWRpYXRlbHlcbiAgICAgIHRoaXMuX2xhc3RSZWZyZXNoTXMgPSByZWZyZXNoUmVxdWVzdFRpbWU7XG4gICAgICB0aGlzLl9pbm5lclJlZnJlc2goKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgYWRkaXRpb25hbCByZXF1ZXN0IHRocm90dGxlZDsgc2V0IHVwIHRyYWlsaW5nIHJlZnJlc2hcbiAgICAgIGNvbnN0IGVsYXBzZWQgPSByZWZyZXNoUmVxdWVzdFRpbWUgLSB0aGlzLl9sYXN0UmVmcmVzaE1zO1xuICAgICAgY29uc3Qgd2FpdFBlcmlvZEJlZm9yZVRyYWlsaW5nUmVmcmVzaCA9IHRoaXMuX2RlYm91bmNlVGhyZXNob2xkTVMgLSBlbGFwc2VkO1xuICAgICAgdGhpcy5fYWRkaXRpb25hbFJlZnJlc2hSZXF1ZXN0ZWQgPSB0cnVlO1xuXG4gICAgICB0aGlzLl9yZWZyZXNoVGltZW91dElEID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9sYXN0UmVmcmVzaE1zID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5faW5uZXJSZWZyZXNoKCk7XG4gICAgICAgIHRoaXMuX2FkZGl0aW9uYWxSZWZyZXNoUmVxdWVzdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hUaW1lb3V0SUQgPSB1bmRlZmluZWQ7IC8vIE5vIGxvbmdlciBuZWVkIHRvIGNsZWFyIHRoZSB0aW1lb3V0XG4gICAgICB9LCB3YWl0UGVyaW9kQmVmb3JlVHJhaWxpbmdSZWZyZXNoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbm5lclJlZnJlc2goKTogdm9pZCB7XG4gICAgLy8gTWFrZSBzdXJlIHZhbHVlcyBhcmUgc2V0XG4gICAgaWYgKHRoaXMuX3Jvd1N0YXJ0ID09PSB1bmRlZmluZWQgfHwgdGhpcy5fcm93RW5kID09PSB1bmRlZmluZWQgfHwgdGhpcy5fcm93Q291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENsYW1wIHZhbHVlc1xuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgodGhpcy5fcm93U3RhcnQsIDApO1xuICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKHRoaXMuX3Jvd0VuZCwgdGhpcy5fcm93Q291bnQgLSAxKTtcblxuICAgIC8vIFJlc2V0IGRlYm91bmNlciAodGhpcyBoYXBwZW5zIGJlZm9yZSByZW5kZXIgY2FsbGJhY2sgYXMgdGhlIHJlbmRlciBjb3VsZCB0cmlnZ2VyIGl0IGFnYWluKVxuICAgIHRoaXMuX3Jvd1N0YXJ0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3Jvd0VuZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIFJ1biByZW5kZXIgY2FsbGJhY2tcbiAgICB0aGlzLl9yZW5kZXJDYWxsYmFjayhzdGFydCwgZW5kKTtcbiAgfVxufVxuXG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcbmltcG9ydCB7IElWaWV3cG9ydCwgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuY29uc3QgRkFMTEJBQ0tfU0NST0xMX0JBUl9XSURUSCA9IDE1O1xuXG5pbnRlcmZhY2UgSVNtb290aFNjcm9sbFN0YXRlIHtcbiAgc3RhcnRUaW1lOiBudW1iZXI7XG4gIG9yaWdpbjogbnVtYmVyO1xuICB0YXJnZXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSB2aWV3cG9ydCBvZiBhIHRlcm1pbmFsLCB0aGUgdmlzaWJsZSBhcmVhIHdpdGhpbiB0aGUgbGFyZ2VyIGJ1ZmZlciBvZiBvdXRwdXQuXG4gKiBMb2dpYyBmb3IgdGhlIHZpcnR1YWwgc2Nyb2xsIGJhciBpcyBpbmNsdWRlZCBpbiB0aGlzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFZpZXdwb3J0IGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElWaWV3cG9ydCB7XG4gIHB1YmxpYyBzY3JvbGxCYXJXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudFJvd0hlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudERldmljZUNlbGxIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdFRvdWNoWTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGFzdFNjcm9sbFRvcDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfYWN0aXZlQnVmZmVyOiBJQnVmZmVyO1xuICBwcml2YXRlIF9yZW5kZXJEaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICAvLyBTdG9yZXMgYSBwYXJ0aWFsIGxpbmUgYW1vdW50IHdoZW4gc2Nyb2xsaW5nLCB0aGlzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBob3cgbXVjaCBvZiBhIGxpbmVcbiAgLy8gaXMgc2Nyb2xsZWQgc28gd2UgY2FuIFwic2Nyb2xsXCIgb3ZlciBwYXJ0aWFsIGxpbmVzIGFuZCBmZWVsIG5hdHVyYWwgb24gdG91Y2hwYWRzLiBUaGlzIGlzIGFcbiAgLy8gcXVpY2sgZml4IGFuZCBjb3VsZCBoYXZlIGEgbW9yZSByb2J1c3Qgc29sdXRpb24gaW4gcGxhY2UgdGhhdCByZXNldCB0aGUgdmFsdWUgd2hlbiBuZWVkZWQuXG4gIHByaXZhdGUgX3doZWVsUGFydGlhbFNjcm9sbDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIF9yZWZyZXNoQW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc21vb3RoU2Nyb2xsU3RhdGU6IElTbW9vdGhTY3JvbGxTdGF0ZSA9IHtcbiAgICBzdGFydFRpbWU6IDAsXG4gICAgb3JpZ2luOiAtMSxcbiAgICB0YXJnZXQ6IC0xXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0U2Nyb2xsTGluZXMgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8eyBhbW91bnQ6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudDogYm9vbGVhbiB9PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFNjcm9sbExpbmVzID0gdGhpcy5fb25SZXF1ZXN0U2Nyb2xsTGluZXMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdmlld3BvcnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zY3JvbGxBcmVhOiBIVE1MRWxlbWVudCxcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJQ2hhclNpemVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NoYXJTaXplU2VydmljZTogSUNoYXJTaXplU2VydmljZSxcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJVGhlbWVTZXJ2aWNlIHRoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWVhc3VyZSB0aGUgd2lkdGggb2YgdGhlIHNjcm9sbGJhci4gSWYgaXQgaXMgMCB3ZSBjYW4gYXNzdW1lIGl0J3MgYW4gT1NYIG92ZXJsYXkgc2Nyb2xsYmFyLlxuICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlIG92ZXJsYXkgc2Nyb2xsYmFyIHdvdWxkIGJlIGhpZGRlbiB1bmRlcm5lYXRoIHRoZSBzY3JlZW4gZWxlbWVudCBpbiB0aGF0XG4gICAgLy8gY2FzZSwgdGhlcmVmb3JlIHdlIGFjY291bnQgZm9yIGEgc3RhbmRhcmQgYW1vdW50IHRvIG1ha2UgaXQgdmlzaWJsZVxuICAgIHRoaXMuc2Nyb2xsQmFyV2lkdGggPSAodGhpcy5fdmlld3BvcnRFbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fc2Nyb2xsQXJlYS5vZmZzZXRXaWR0aCkgfHwgRkFMTEJBQ0tfU0NST0xMX0JBUl9XSURUSDtcbiAgICB0aGlzLnJlZ2lzdGVyKGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl92aWV3cG9ydEVsZW1lbnQsICdzY3JvbGwnLCB0aGlzLl9oYW5kbGVTY3JvbGwuYmluZCh0aGlzKSkpO1xuXG4gICAgLy8gVHJhY2sgcHJvcGVydGllcyB1c2VkIGluIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGNvZGUgbWFudWFsbHkgdG8gYXZvaWQgdXNpbmcgc2xvdyBnZXR0ZXJzXG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZShlID0+IHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IGUuYWN0aXZlQnVmZmVyKSk7XG4gICAgdGhpcy5fcmVuZGVyRGltZW5zaW9ucyA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucztcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX3JlbmRlclNlcnZpY2Uub25EaW1lbnNpb25zQ2hhbmdlKGUgPT4gdGhpcy5fcmVuZGVyRGltZW5zaW9ucyA9IGUpKTtcblxuICAgIHRoaXMuX2hhbmRsZVRoZW1lQ2hhbmdlKHRoZW1lU2VydmljZS5jb2xvcnMpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKGUgPT4gdGhpcy5faGFuZGxlVGhlbWVDaGFuZ2UoZSkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ3Njcm9sbGJhY2snLCAoKSA9PiB0aGlzLnN5bmNTY3JvbGxBcmVhKCkpKTtcblxuICAgIC8vIFBlcmZvcm0gdGhpcyBhc3luYyB0byBlbnN1cmUgdGhlIElDaGFyU2l6ZVNlcnZpY2UgaXMgcmVhZHkuXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnN5bmNTY3JvbGxBcmVhKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlVGhlbWVDaGFuZ2UoY29sb3JzOiBSZWFkb25seUNvbG9yU2V0KTogdm9pZCB7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9ycy5iYWNrZ3JvdW5kLmNzcztcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50Um93SGVpZ2h0ID0gMDtcbiAgICB0aGlzLl9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodCA9IDA7XG4gICAgdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoID0gMDtcbiAgICB0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCA9IDA7XG4gICAgdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0ID0gMDtcbiAgICB0aGlzLl9sYXN0VG91Y2hZID0gMDtcbiAgICB0aGlzLl9sYXN0U2Nyb2xsVG9wID0gMDtcbiAgICAvLyBTeW5jIG9uIG5leHQgYW5pbWF0aW9uIGZyYW1lIHRvIGVuc3VyZSB0aGUgbmV3IHRlcm1pbmFsIHN0YXRlIGlzIHVzZWRcbiAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnN5bmNTY3JvbGxBcmVhKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyByb3cgaGVpZ2h0LCBzZXR0aW5nIGxpbmUtaGVpZ2h0LCB2aWV3cG9ydCBoZWlnaHQgYW5kIHNjcm9sbCBhcmVhIGhlaWdodCBpZlxuICAgKiBuZWNlc3NhcnkuXG4gICAqL1xuICBwcml2YXRlIF9yZWZyZXNoKGltbWVkaWF0ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIHRoaXMuX2lubmVyUmVmcmVzaCgpO1xuICAgICAgaWYgKHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuX2lubmVyUmVmcmVzaCgpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbm5lclJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NoYXJTaXplU2VydmljZS5oZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLl9jdXJyZW50Um93SGVpZ2h0ID0gdGhpcy5fcmVuZGVyRGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgLyB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByO1xuICAgICAgdGhpcy5fY3VycmVudERldmljZUNlbGxIZWlnaHQgPSB0aGlzLl9yZW5kZXJEaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodDtcbiAgICAgIHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0ID0gdGhpcy5fdmlld3BvcnRFbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgIGNvbnN0IG5ld0J1ZmZlckhlaWdodCA9IE1hdGgucm91bmQodGhpcy5fY3VycmVudFJvd0hlaWdodCAqIHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCkgKyAodGhpcy5fbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQgLSB0aGlzLl9yZW5kZXJEaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0KTtcbiAgICAgIGlmICh0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQgIT09IG5ld0J1ZmZlckhlaWdodCkge1xuICAgICAgICB0aGlzLl9sYXN0UmVjb3JkZWRCdWZmZXJIZWlnaHQgPSBuZXdCdWZmZXJIZWlnaHQ7XG4gICAgICAgIHRoaXMuX3Njcm9sbEFyZWEuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTeW5jIHNjcm9sbFRvcFxuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwICogdGhpcy5fY3VycmVudFJvd0hlaWdodDtcbiAgICBpZiAodGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCAhPT0gc2Nyb2xsVG9wKSB7XG4gICAgICAvLyBJZ25vcmUgdGhlIG5leHQgc2Nyb2xsIGV2ZW50IHdoaWNoIHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IHNldHRpbmcgdGhlIHNjcm9sbFRvcCBhcyB3ZSBkbyBub3RcbiAgICAgIC8vIHdhbnQgdGhpcyBldmVudCB0byBzY3JvbGwgdGhlIHRlcm1pbmFsXG4gICAgICB0aGlzLl9pZ25vcmVOZXh0U2Nyb2xsRXZlbnQgPSB0cnVlO1xuICAgICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgZGltZW5zaW9ucyBhbmQgc3luY2hyb25pemVzIHRoZSBzY3JvbGwgYXJlYSBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICBwdWJsaWMgc3luY1Njcm9sbEFyZWEoaW1tZWRpYXRlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBJZiBidWZmZXIgaGVpZ2h0IGNoYW5nZWRcbiAgICBpZiAodGhpcy5fbGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoICE9PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmxlbmd0aDtcbiAgICAgIHRoaXMuX3JlZnJlc2goaW1tZWRpYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB2aWV3cG9ydCBoZWlnaHQgY2hhbmdlZFxuICAgIGlmICh0aGlzLl9sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCAhPT0gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0KSB7XG4gICAgICB0aGlzLl9yZWZyZXNoKGltbWVkaWF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGJ1ZmZlciBwb3NpdGlvbiBkb2Vzbid0IG1hdGNoIGxhc3Qgc2Nyb2xsIHRvcFxuICAgIGlmICh0aGlzLl9sYXN0U2Nyb2xsVG9wICE9PSB0aGlzLl9hY3RpdmVCdWZmZXIueWRpc3AgKiB0aGlzLl9jdXJyZW50Um93SGVpZ2h0KSB7XG4gICAgICB0aGlzLl9yZWZyZXNoKGltbWVkaWF0ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgcm93IGhlaWdodCBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuX3JlbmRlckRpbWVuc2lvbnMuZGV2aWNlLmNlbGwuaGVpZ2h0ICE9PSB0aGlzLl9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodCkge1xuICAgICAgdGhpcy5fcmVmcmVzaChpbW1lZGlhdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHNjcm9sbCBldmVudHMgb24gdGhlIHZpZXdwb3J0LCBjYWxjdWxhdGluZyB0aGUgbmV3IHZpZXdwb3J0IGFuZCByZXF1ZXN0aW5nIHRoZVxuICAgKiB0ZXJtaW5hbCB0byBzY3JvbGwgdG8gaXQuXG4gICAqIEBwYXJhbSBldiBUaGUgc2Nyb2xsIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlU2Nyb2xsKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIFJlY29yZCBjdXJyZW50IHNjcm9sbCB0b3AgcG9zaXRpb25cbiAgICB0aGlzLl9sYXN0U2Nyb2xsVG9wID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgIC8vIERvbid0IGF0dGVtcHQgdG8gc2Nyb2xsIGlmIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlLCBvdGhlcndpc2Ugc2Nyb2xsVG9wIHdpbGwgYmUgY29ycnVwdFxuICAgIC8vIHdoaWNoIGNhdXNlcyB0aGUgdGVybWluYWwgdG8gc2Nyb2xsIHRoZSBidWZmZXIgdG8gdGhlIHRvcFxuICAgIGlmICghdGhpcy5fdmlld3BvcnRFbGVtZW50Lm9mZnNldFBhcmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElnbm9yZSB0aGUgZXZlbnQgaWYgaXQgd2FzIGZsYWdnZWQgdG8gaWdub3JlICh3aGVuIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50IGlzIGZyb20gVmlld3BvcnQpXG4gICAgaWYgKHRoaXMuX2lnbm9yZU5leHRTY3JvbGxFdmVudCkge1xuICAgICAgdGhpcy5faWdub3JlTmV4dFNjcm9sbEV2ZW50ID0gZmFsc2U7XG4gICAgICAvLyBTdGlsbCB0cmlnZ2VyIHRoZSBzY3JvbGwgc28gbGluZXMgZ2V0IHJlZnJlc2hlZFxuICAgICAgdGhpcy5fb25SZXF1ZXN0U2Nyb2xsTGluZXMuZmlyZSh7IGFtb3VudDogMCwgc3VwcHJlc3NTY3JvbGxFdmVudDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdSb3cgPSBNYXRoLnJvdW5kKHRoaXMuX2xhc3RTY3JvbGxUb3AgLyB0aGlzLl9jdXJyZW50Um93SGVpZ2h0KTtcbiAgICBjb25zdCBkaWZmID0gbmV3Um93IC0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7XG4gICAgdGhpcy5fb25SZXF1ZXN0U2Nyb2xsTGluZXMuZmlyZSh7IGFtb3VudDogZGlmZiwgc3VwcHJlc3NTY3JvbGxFdmVudDogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3Ntb290aFNjcm9sbCgpOiB2b2lkIHtcbiAgICAvLyBDaGVjayB2YWxpZCBzdGF0ZVxuICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8IHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbiA9PT0gLTEgfHwgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBjb21wbGV0ZVxuICAgIGNvbnN0IHBlcmNlbnQgPSB0aGlzLl9zbW9vdGhTY3JvbGxQZXJjZW50KCk7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbiArIE1hdGgucm91bmQocGVyY2VudCAqICh0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgLSB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4pKTtcblxuICAgIC8vIENvbnRpbnVlIG9yIGZpbmlzaCBzbW9vdGggc2Nyb2xsXG4gICAgaWYgKHBlcmNlbnQgPCAxKSB7XG4gICAgICB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl9zbW9vdGhTY3JvbGwoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NsZWFyU21vb3RoU2Nyb2xsU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zbW9vdGhTY3JvbGxQZXJjZW50KCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNtb290aFNjcm9sbER1cmF0aW9uIHx8ICF0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5zdGFydFRpbWUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4oKERhdGUubm93KCkgLSB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5zdGFydFRpbWUpIC8gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zbW9vdGhTY3JvbGxEdXJhdGlvbiwgMSksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJTbW9vdGhTY3JvbGxTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5zdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLm9yaWdpbiA9IC0xO1xuICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYnViYmxpbmcgb2Ygc2Nyb2xsIGV2ZW50IGluIGNhc2UgdGhlIHZpZXdwb3J0IGhhcyByZWFjaGVkIHRvcCBvciBib3R0b21cbiAgICogQHBhcmFtIGV2IFRoZSBzY3JvbGwgZXZlbnQuXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCBzY3JvbGxlZFxuICAgKi9cbiAgcHJpdmF0ZSBfYnViYmxlU2Nyb2xsKGV2OiBFdmVudCwgYW1vdW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzY3JvbGxQb3NGcm9tVG9wID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCArIHRoaXMuX2xhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0O1xuICAgIGlmICgoYW1vdW50IDwgMCAmJiB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wICE9PSAwKSB8fFxuICAgICAgKGFtb3VudCA+IDAgJiYgc2Nyb2xsUG9zRnJvbVRvcCA8IHRoaXMuX2xhc3RSZWNvcmRlZEJ1ZmZlckhlaWdodCkpIHtcbiAgICAgIGlmIChldi5jYW5jZWxhYmxlKSB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgbW91c2Ugd2hlZWwgZXZlbnRzIGJ5IGFkanVzdGluZyB0aGUgdmlld3BvcnQncyBzY3JvbGxUb3AgYW5kIGRlbGVnYXRpbmcgdGhlIGFjdHVhbFxuICAgKiBzY3JvbGxpbmcgdG8gYG9uU2Nyb2xsYCwgdGhpcyBldmVudCBuZWVkcyB0byBiZSBhdHRhY2hlZCBtYW51YWxseSBieSB0aGUgY29uc3VtZXIgb2ZcbiAgICogYFZpZXdwb3J0YC5cbiAgICogQHBhcmFtIGV2IFRoZSBtb3VzZSB3aGVlbCBldmVudC5cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVXaGVlbChldjogV2hlZWxFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFtb3VudCA9IHRoaXMuX2dldFBpeGVsc1Njcm9sbGVkKGV2KTtcbiAgICBpZiAoYW1vdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zbW9vdGhTY3JvbGxEdXJhdGlvbikge1xuICAgICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCArPSBhbW91bnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBpZiAodGhpcy5fc21vb3RoU2Nyb2xsUGVyY2VudCgpIDwgMSkge1xuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5vcmlnaW4gPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICBpZiAodGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID09PSAtMSkge1xuICAgICAgICAgIHRoaXMuX3Ntb290aFNjcm9sbFN0YXRlLnRhcmdldCA9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgKyBhbW91bnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ICs9IGFtb3VudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPSBNYXRoLm1heChNYXRoLm1pbih0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxIZWlnaHQpLCAwKTtcbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jbGVhclNtb290aFNjcm9sbFN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9idWJibGVTY3JvbGwoZXYsIGFtb3VudCk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGRpc3AgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNtb290aFNjcm9sbER1cmF0aW9uKSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RTY3JvbGxMaW5lcy5maXJlKHsgYW1vdW50OiBkaXNwLCBzdXBwcmVzc1Njcm9sbEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYW1vdW50ID0gZGlzcCAqIHRoaXMuX2N1cnJlbnRSb3dIZWlnaHQ7XG4gICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgaWYgKHRoaXMuX3Ntb290aFNjcm9sbFBlcmNlbnQoKSA8IDEpIHtcbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUudGFyZ2V0ID0gdGhpcy5fc21vb3RoU2Nyb2xsU3RhdGUub3JpZ2luICsgYW1vdW50O1xuICAgICAgICB0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQgPSBNYXRoLm1heChNYXRoLm1pbih0aGlzLl9zbW9vdGhTY3JvbGxTdGF0ZS50YXJnZXQsIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxIZWlnaHQpLCAwKTtcbiAgICAgICAgdGhpcy5fc21vb3RoU2Nyb2xsKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jbGVhclNtb290aFNjcm9sbFN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UGl4ZWxzU2Nyb2xsZWQoZXY6IFdoZWVsRXZlbnQpOiBudW1iZXIge1xuICAgIC8vIERvIG5vdGhpbmcgaWYgaXQncyBub3QgYSB2ZXJ0aWNhbCBzY3JvbGwgZXZlbnRcbiAgICBpZiAoZXYuZGVsdGFZID09PSAwIHx8IGV2LnNoaWZ0S2V5KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QSVhFTFxuICAgIGxldCBhbW91bnQgPSB0aGlzLl9hcHBseVNjcm9sbE1vZGlmaWVyKGV2LmRlbHRhWSwgZXYpO1xuICAgIGlmIChldi5kZWx0YU1vZGUgPT09IFdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHtcbiAgICAgIGFtb3VudCAqPSB0aGlzLl9jdXJyZW50Um93SGVpZ2h0O1xuICAgIH0gZWxzZSBpZiAoZXYuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QQUdFKSB7XG4gICAgICBhbW91bnQgKj0gdGhpcy5fY3VycmVudFJvd0hlaWdodCAqIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICB9XG4gICAgcmV0dXJuIGFtb3VudDtcbiAgfVxuXG5cbiAgcHVibGljIGdldEJ1ZmZlckVsZW1lbnRzKHN0YXJ0TGluZTogbnVtYmVyLCBlbmRMaW5lPzogbnVtYmVyKTogeyBidWZmZXJFbGVtZW50czogSFRNTEVsZW1lbnRbXSwgY3Vyc29yRWxlbWVudD86IEhUTUxFbGVtZW50IH0ge1xuICAgIGxldCBjdXJyZW50TGluZTogc3RyaW5nID0gJyc7XG4gICAgbGV0IGN1cnNvckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJ1ZmZlckVsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG4gICAgY29uc3QgZW5kID0gZW5kTGluZSA/PyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5sZW5ndGg7XG4gICAgY29uc3QgbGluZXMgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcztcbiAgICBmb3IgKGxldCBpID0gc3RhcnRMaW5lOyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpbmUgPSBsaW5lcy5nZXQoaSk7XG4gICAgICBpZiAoIWxpbmUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBpc1dyYXBwZWQgPSBsaW5lcy5nZXQoaSArIDEpPy5pc1dyYXBwZWQ7XG4gICAgICBjdXJyZW50TGluZSArPSBsaW5lLnRyYW5zbGF0ZVRvU3RyaW5nKCFpc1dyYXBwZWQpO1xuICAgICAgaWYgKCFpc1dyYXBwZWQgfHwgaSA9PT0gbGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LnRleHRDb250ZW50ID0gY3VycmVudExpbmU7XG4gICAgICAgIGJ1ZmZlckVsZW1lbnRzLnB1c2goZGl2KTtcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjdXJzb3JFbGVtZW50ID0gZGl2O1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRMaW5lID0gJyc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGJ1ZmZlckVsZW1lbnRzLCBjdXJzb3JFbGVtZW50IH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBpeGVscyBzY3JvbGxlZCBieSB0aGUgbW91c2UgZXZlbnQgdGFraW5nIGludG8gYWNjb3VudCB3aGF0IHR5cGUgb2YgZGVsdGFcbiAgICogaXMgYmVpbmcgdXNlZC5cbiAgICogQHBhcmFtIGV2IFRoZSBtb3VzZSB3aGVlbCBldmVudC5cbiAgICovXG4gIHB1YmxpYyBnZXRMaW5lc1Njcm9sbGVkKGV2OiBXaGVlbEV2ZW50KTogbnVtYmVyIHtcbiAgICAvLyBEbyBub3RoaW5nIGlmIGl0J3Mgbm90IGEgdmVydGljYWwgc2Nyb2xsIGV2ZW50XG4gICAgaWYgKGV2LmRlbHRhWSA9PT0gMCB8fCBldi5zaGlmdEtleSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gV2hlZWxFdmVudC5ET01fREVMVEFfTElORVxuICAgIGxldCBhbW91bnQgPSB0aGlzLl9hcHBseVNjcm9sbE1vZGlmaWVyKGV2LmRlbHRhWSwgZXYpO1xuICAgIGlmIChldi5kZWx0YU1vZGUgPT09IFdoZWVsRXZlbnQuRE9NX0RFTFRBX1BJWEVMKSB7XG4gICAgICBhbW91bnQgLz0gdGhpcy5fY3VycmVudFJvd0hlaWdodCArIDAuMDsgLy8gUHJldmVudCBpbnRlZ2VyIGRpdmlzaW9uXG4gICAgICB0aGlzLl93aGVlbFBhcnRpYWxTY3JvbGwgKz0gYW1vdW50O1xuICAgICAgYW1vdW50ID0gTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLl93aGVlbFBhcnRpYWxTY3JvbGwpKSAqICh0aGlzLl93aGVlbFBhcnRpYWxTY3JvbGwgPiAwID8gMSA6IC0xKTtcbiAgICAgIHRoaXMuX3doZWVsUGFydGlhbFNjcm9sbCAlPSAxO1xuICAgIH0gZWxzZSBpZiAoZXYuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QQUdFKSB7XG4gICAgICBhbW91bnQgKj0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIH1cbiAgICByZXR1cm4gYW1vdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlTY3JvbGxNb2RpZmllcihhbW91bnQ6IG51bWJlciwgZXY6IFdoZWVsRXZlbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IG1vZGlmaWVyID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mYXN0U2Nyb2xsTW9kaWZpZXI7XG4gICAgLy8gTXVsdGlwbHkgdGhlIHNjcm9sbCBzcGVlZCB3aGVuIHRoZSBtb2RpZmllciBpcyBkb3duXG4gICAgaWYgKChtb2RpZmllciA9PT0gJ2FsdCcgJiYgZXYuYWx0S2V5KSB8fFxuICAgICAgKG1vZGlmaWVyID09PSAnY3RybCcgJiYgZXYuY3RybEtleSkgfHxcbiAgICAgIChtb2RpZmllciA9PT0gJ3NoaWZ0JyAmJiBldi5zaGlmdEtleSkpIHtcbiAgICAgIHJldHVybiBhbW91bnQgKiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZhc3RTY3JvbGxTZW5zaXRpdml0eSAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFtb3VudCAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgdG91Y2hzdGFydCBldmVudCwgcmVjb3JkaW5nIHRoZSB0b3VjaCBvY2N1cnJlZC5cbiAgICogQHBhcmFtIGV2IFRoZSB0b3VjaCBldmVudC5cbiAgICovXG4gIHB1YmxpYyBoYW5kbGVUb3VjaFN0YXJ0KGV2OiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fbGFzdFRvdWNoWSA9IGV2LnRvdWNoZXNbMF0ucGFnZVk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgdG91Y2htb3ZlIGV2ZW50LCBzY3JvbGxpbmcgdGhlIHZpZXdwb3J0IGlmIHRoZSBwb3NpdGlvbiBzaGlmdGVkLlxuICAgKiBAcGFyYW0gZXYgVGhlIHRvdWNoIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGhhbmRsZVRvdWNoTW92ZShldjogVG91Y2hFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGRlbHRhWSA9IHRoaXMuX2xhc3RUb3VjaFkgLSBldi50b3VjaGVzWzBdLnBhZ2VZO1xuICAgIHRoaXMuX2xhc3RUb3VjaFkgPSBldi50b3VjaGVzWzBdLnBhZ2VZO1xuICAgIGlmIChkZWx0YVkgPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCArPSBkZWx0YVk7XG4gICAgcmV0dXJuIHRoaXMuX2J1YmJsZVNjcm9sbChldiwgZGVsdGFZKTtcbiAgfVxufVxuIiwiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElJbnRlcm5hbERlY29yYXRpb24gfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgQnVmZmVyRGVjb3JhdGlvblJlbmRlcmVyIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25FbGVtZW50czogTWFwPElJbnRlcm5hbERlY29yYXRpb24sIEhUTUxFbGVtZW50PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIF9hbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9hbHRCdWZmZXJJc0FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9kaW1lbnNpb25zQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9kZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5fY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWRlY29yYXRpb24tY29udGFpbmVyJyk7XG4gICAgdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jb250YWluZXIpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSgoKSA9PiB0aGlzLl9kb1JlZnJlc2hEZWNvcmF0aW9ucygpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uRGltZW5zaW9uc0NoYW5nZSgoKSA9PiB7XG4gICAgICB0aGlzLl9kaW1lbnNpb25zQ2hhbmdlZCA9IHRydWU7XG4gICAgICB0aGlzLl9xdWV1ZVJlZnJlc2goKTtcbiAgICB9KSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25EcHJDaGFuZ2UoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKCgpID0+IHtcbiAgICAgIHRoaXMuX2FsdEJ1ZmZlcklzQWN0aXZlID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIgPT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hbHQ7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVnaXN0ZXJlZCgoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2goKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVtb3ZlZChkZWNvcmF0aW9uID0+IHRoaXMuX3JlbW92ZURlY29yYXRpb24oZGVjb3JhdGlvbikpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuY2xlYXIoKTtcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9xdWV1ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9yZW5kZXJTZXJ2aWNlLmFkZFJlZnJlc2hDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9kb1JlZnJlc2hEZWNvcmF0aW9ucygpO1xuICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kb1JlZnJlc2hEZWNvcmF0aW9ucygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGRlY29yYXRpb24gb2YgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZGVjb3JhdGlvbnMpIHtcbiAgICAgIHRoaXMuX3JlbmRlckRlY29yYXRpb24oZGVjb3JhdGlvbik7XG4gICAgfVxuICAgIHRoaXMuX2RpbWVuc2lvbnNDaGFuZ2VkID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJEZWNvcmF0aW9uKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9yZWZyZXNoU3R5bGUoZGVjb3JhdGlvbik7XG4gICAgaWYgKHRoaXMuX2RpbWVuc2lvbnNDaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoWFBvc2l0aW9uKGRlY29yYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUVsZW1lbnQoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbik6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLm1haW5Eb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWRlY29yYXRpb24nKTtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3h0ZXJtLWRlY29yYXRpb24tdG9wLWxheWVyJywgZGVjb3JhdGlvbj8ub3B0aW9ucz8ubGF5ZXIgPT09ICd0b3AnKTtcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7TWF0aC5yb3VuZCgoZGVjb3JhdGlvbi5vcHRpb25zLndpZHRoIHx8IDEpICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoKX1weGA7XG4gICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHsoZGVjb3JhdGlvbi5vcHRpb25zLmhlaWdodCB8fCAxKSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7KGRlY29yYXRpb24ubWFya2VyLmxpbmUgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLnlkaXNwKSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUubGluZUhlaWdodCA9IGAke3RoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuXG4gICAgY29uc3QgeCA9IGRlY29yYXRpb24ub3B0aW9ucy54ID8/IDA7XG4gICAgaWYgKHggJiYgeCA+IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scykge1xuICAgICAgLy8gZXhjZWVkZWQgdGhlIGNvbnRhaW5lciB3aWR0aCwgc28gaGlkZVxuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgICB0aGlzLl9yZWZyZXNoWFBvc2l0aW9uKGRlY29yYXRpb24sIGVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoU3R5bGUoZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGxpbmUgPSBkZWNvcmF0aW9uLm1hcmtlci5saW5lIC0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS55ZGlzcDtcbiAgICBpZiAobGluZSA8IDAgfHwgbGluZSA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIC8vIG91dHNpZGUgb2Ygdmlld3BvcnRcbiAgICAgIGlmIChkZWNvcmF0aW9uLmVsZW1lbnQpIHtcbiAgICAgICAgZGVjb3JhdGlvbi5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIGRlY29yYXRpb24ub25SZW5kZXJFbWl0dGVyLmZpcmUoZGVjb3JhdGlvbi5lbGVtZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZ2V0KGRlY29yYXRpb24pO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQgPSB0aGlzLl9jcmVhdGVFbGVtZW50KGRlY29yYXRpb24pO1xuICAgICAgICBkZWNvcmF0aW9uLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuc2V0KGRlY29yYXRpb24sIGVsZW1lbnQpO1xuICAgICAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIGRlY29yYXRpb24ub25EaXNwb3NlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9kZWNvcmF0aW9uRWxlbWVudHMuZGVsZXRlKGRlY29yYXRpb24pO1xuICAgICAgICAgIGVsZW1lbnQhLnJlbW92ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7bGluZSAqIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHR9cHhgO1xuICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fYWx0QnVmZmVySXNBY3RpdmUgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgZGVjb3JhdGlvbi5vblJlbmRlckVtaXR0ZXIuZmlyZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoWFBvc2l0aW9uKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24sIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gZGVjb3JhdGlvbi5lbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHggPSBkZWNvcmF0aW9uLm9wdGlvbnMueCA/PyAwO1xuICAgIGlmICgoZGVjb3JhdGlvbi5vcHRpb25zLmFuY2hvciB8fCAnbGVmdCcpID09PSAncmlnaHQnKSB7XG4gICAgICBlbGVtZW50LnN0eWxlLnJpZ2h0ID0geCA/IGAke3ggKiB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNlbGwud2lkdGh9cHhgIDogJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IHggPyBgJHt4ICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRofXB4YCA6ICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZURlY29yYXRpb24oZGVjb3JhdGlvbjogSUludGVybmFsRGVjb3JhdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX2RlY29yYXRpb25FbGVtZW50cy5nZXQoZGVjb3JhdGlvbik/LnJlbW92ZSgpO1xuICAgIHRoaXMuX2RlY29yYXRpb25FbGVtZW50cy5kZWxldGUoZGVjb3JhdGlvbik7XG4gICAgZGVjb3JhdGlvbi5kaXNwb3NlKCk7XG4gIH1cbn1cbiIsIi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJSW50ZXJuYWxEZWNvcmF0aW9uIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBJQ29sb3Jab25lU3RvcmUge1xuICByZWFkb25seSB6b25lczogSUNvbG9yWm9uZVtdO1xuICBjbGVhcigpOiB2b2lkO1xuICBhZGREZWNvcmF0aW9uKGRlY29yYXRpb246IElJbnRlcm5hbERlY29yYXRpb24pOiB2b2lkO1xuICAvKipcbiAgICogU2V0cyB0aGUgYW1vdW50IG9mIHBhZGRpbmcgaW4gbGluZXMgdGhhdCB3aWxsIGJlIGFkZGVkIGJldHdlZW4gem9uZXMsIGlmIG5ldyBsaW5lcyBpbnRlcnNlY3RcbiAgICogdGhlIHBhZGRpbmcgdGhleSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBzYW1lIHpvbmUuXG4gICAqL1xuICBzZXRQYWRkaW5nKHBhZGRpbmc6IHsgW3Bvc2l0aW9uOiBzdHJpbmddOiBudW1iZXIgfSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbG9yWm9uZSB7XG4gIC8qKiBDb2xvciBpbiBhIGZvcm1hdCBzdXBwb3J0ZWQgYnkgY2FudmFzJyBmaWxsU3R5bGUuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIHBvc2l0aW9uOiAnZnVsbCcgfCAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCcgfCB1bmRlZmluZWQ7XG4gIHN0YXJ0QnVmZmVyTGluZTogbnVtYmVyO1xuICBlbmRCdWZmZXJMaW5lOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBJTWluaW1hbERlY29yYXRpb25Gb3JDb2xvclpvbmUge1xuICBtYXJrZXI6IFBpY2s8SUludGVybmFsRGVjb3JhdGlvblsnbWFya2VyJ10sICdsaW5lJz47XG4gIG9wdGlvbnM6IFBpY2s8SUludGVybmFsRGVjb3JhdGlvblsnb3B0aW9ucyddLCAnb3ZlcnZpZXdSdWxlck9wdGlvbnMnPjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbG9yWm9uZVN0b3JlIGltcGxlbWVudHMgSUNvbG9yWm9uZVN0b3JlIHtcbiAgcHJpdmF0ZSBfem9uZXM6IElDb2xvclpvbmVbXSA9IFtdO1xuXG4gIC8vIFRoZSB6b25lIHBvb2wgaXMgdXNlZCB0byBrZWVwIHpvbmUgb2JqZWN0cyBmcm9tIGJlaW5nIGZyZWVkIGJldHdlZW4gY2xlYXJpbmcgdGhlIGNvbG9yIHpvbmVcbiAgLy8gc3RvcmUgYW5kIGZldGNoaW5nIHRoZSB6b25lcy4gVGhpcyBoZWxwcyByZWR1Y2UgR0MgcHJlc3N1cmUgc2luY2UgdGhlIGNvbG9yIHpvbmVzIGFyZVxuICAvLyBhY2N1bXVsYXRlZCBvbiBwb3RlbnRpYWxseSBldmVyeSBzY3JvbGwgZXZlbnQuXG4gIHByaXZhdGUgX3pvbmVQb29sOiBJQ29sb3Jab25lW10gPSBbXTtcbiAgcHJpdmF0ZSBfem9uZVBvb2xJbmRleCA9IDA7XG5cbiAgcHJpdmF0ZSBfbGluZVBhZGRpbmc6IHsgW3Bvc2l0aW9uOiBzdHJpbmddOiBudW1iZXIgfSA9IHtcbiAgICBmdWxsOiAwLFxuICAgIGxlZnQ6IDAsXG4gICAgY2VudGVyOiAwLFxuICAgIHJpZ2h0OiAwXG4gIH07XG5cbiAgcHVibGljIGdldCB6b25lcygpOiBJQ29sb3Jab25lW10ge1xuICAgIC8vIFRyaW0gdGhlIHpvbmUgcG9vbCB0byBmcmVlIHVudXNlZCBtZW1vcnlcbiAgICB0aGlzLl96b25lUG9vbC5sZW5ndGggPSBNYXRoLm1pbih0aGlzLl96b25lUG9vbC5sZW5ndGgsIHRoaXMuX3pvbmVzLmxlbmd0aCk7XG4gICAgcmV0dXJuIHRoaXMuX3pvbmVzO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX3pvbmVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fem9uZVBvb2xJbmRleCA9IDA7XG4gIH1cblxuICBwdWJsaWMgYWRkRGVjb3JhdGlvbihkZWNvcmF0aW9uOiBJTWluaW1hbERlY29yYXRpb25Gb3JDb2xvclpvbmUpOiB2b2lkIHtcbiAgICBpZiAoIWRlY29yYXRpb24ub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHogb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGlmICh6LmNvbG9yID09PSBkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMuY29sb3IgJiZcbiAgICAgICAgICB6LnBvc2l0aW9uID09PSBkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVJbnRlcnNlY3RzWm9uZSh6LCBkZWNvcmF0aW9uLm1hcmtlci5saW5lKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbGluZUFkamFjZW50VG9ab25lKHosIGRlY29yYXRpb24ubWFya2VyLmxpbmUsIGRlY29yYXRpb24ub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5wb3NpdGlvbikpIHtcbiAgICAgICAgICB0aGlzLl9hZGRMaW5lVG9ab25lKHosIGRlY29yYXRpb24ubWFya2VyLmxpbmUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBDcmVhdGUgdXNpbmcgem9uZSBwb29sIGlmIHBvc3NpYmxlXG4gICAgaWYgKHRoaXMuX3pvbmVQb29sSW5kZXggPCB0aGlzLl96b25lUG9vbC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXhdLmNvbG9yID0gZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLmNvbG9yO1xuICAgICAgdGhpcy5fem9uZVBvb2xbdGhpcy5fem9uZVBvb2xJbmRleF0ucG9zaXRpb24gPSBkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb247XG4gICAgICB0aGlzLl96b25lUG9vbFt0aGlzLl96b25lUG9vbEluZGV4XS5zdGFydEJ1ZmZlckxpbmUgPSBkZWNvcmF0aW9uLm1hcmtlci5saW5lO1xuICAgICAgdGhpcy5fem9uZVBvb2xbdGhpcy5fem9uZVBvb2xJbmRleF0uZW5kQnVmZmVyTGluZSA9IGRlY29yYXRpb24ubWFya2VyLmxpbmU7XG4gICAgICB0aGlzLl96b25lcy5wdXNoKHRoaXMuX3pvbmVQb29sW3RoaXMuX3pvbmVQb29sSW5kZXgrK10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBDcmVhdGVcbiAgICB0aGlzLl96b25lcy5wdXNoKHtcbiAgICAgIGNvbG9yOiBkZWNvcmF0aW9uLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMuY29sb3IsXG4gICAgICBwb3NpdGlvbjogZGVjb3JhdGlvbi5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zLnBvc2l0aW9uLFxuICAgICAgc3RhcnRCdWZmZXJMaW5lOiBkZWNvcmF0aW9uLm1hcmtlci5saW5lLFxuICAgICAgZW5kQnVmZmVyTGluZTogZGVjb3JhdGlvbi5tYXJrZXIubGluZVxuICAgIH0pO1xuICAgIHRoaXMuX3pvbmVQb29sLnB1c2godGhpcy5fem9uZXNbdGhpcy5fem9uZXMubGVuZ3RoIC0gMV0pO1xuICAgIHRoaXMuX3pvbmVQb29sSW5kZXgrKztcbiAgfVxuXG4gIHB1YmxpYyBzZXRQYWRkaW5nKHBhZGRpbmc6IHsgW3Bvc2l0aW9uOiBzdHJpbmddOiBudW1iZXIgfSk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmVQYWRkaW5nID0gcGFkZGluZztcbiAgfVxuXG4gIHByaXZhdGUgX2xpbmVJbnRlcnNlY3RzWm9uZSh6b25lOiBJQ29sb3Jab25lLCBsaW5lOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbGluZSA+PSB6b25lLnN0YXJ0QnVmZmVyTGluZSAmJlxuICAgICAgbGluZSA8PSB6b25lLmVuZEJ1ZmZlckxpbmVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGluZUFkamFjZW50VG9ab25lKHpvbmU6IElDb2xvclpvbmUsIGxpbmU6IG51bWJlciwgcG9zaXRpb246IElDb2xvclpvbmVbJ3Bvc2l0aW9uJ10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgKGxpbmUgPj0gem9uZS5zdGFydEJ1ZmZlckxpbmUgLSB0aGlzLl9saW5lUGFkZGluZ1twb3NpdGlvbiB8fCAnZnVsbCddKSAmJlxuICAgICAgKGxpbmUgPD0gem9uZS5lbmRCdWZmZXJMaW5lICsgdGhpcy5fbGluZVBhZGRpbmdbcG9zaXRpb24gfHwgJ2Z1bGwnXSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTGluZVRvWm9uZSh6b25lOiBJQ29sb3Jab25lLCBsaW5lOiBudW1iZXIpOiB2b2lkIHtcbiAgICB6b25lLnN0YXJ0QnVmZmVyTGluZSA9IE1hdGgubWluKHpvbmUuc3RhcnRCdWZmZXJMaW5lLCBsaW5lKTtcbiAgICB6b25lLmVuZEJ1ZmZlckxpbmUgPSBNYXRoLm1heCh6b25lLmVuZEJ1ZmZlckxpbmUsIGxpbmUpO1xuICB9XG59XG4iLCIvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuaW1wb3J0IHsgQ29sb3Jab25lU3RvcmUsIElDb2xvclpvbmUsIElDb2xvclpvbmVTdG9yZSB9IGZyb20gJ2Jyb3dzZXIvZGVjb3JhdGlvbnMvQ29sb3Jab25lU3RvcmUnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSwgSVJlbmRlclNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuLy8gSGVscGVyIG9iamVjdHMgdG8gYXZvaWQgZXhjZXNzaXZlIGNhbGN1bGF0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24gZHVyaW5nIHJlbmRlcmluZy4gVGhlc2UgYXJlXG4vLyBzdGF0aWMgdmFsdWVzIGZvciBlYWNoIHJlbmRlciBhbmQgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBkZWNvcmF0aW9uIHBvc2l0aW9uIGFzIHRoZSBrZXkuXG5jb25zdCBkcmF3SGVpZ2h0ID0ge1xuICBmdWxsOiAwLFxuICBsZWZ0OiAwLFxuICBjZW50ZXI6IDAsXG4gIHJpZ2h0OiAwXG59O1xuY29uc3QgZHJhd1dpZHRoID0ge1xuICBmdWxsOiAwLFxuICBsZWZ0OiAwLFxuICBjZW50ZXI6IDAsXG4gIHJpZ2h0OiAwXG59O1xuY29uc3QgZHJhd1ggPSB7XG4gIGZ1bGw6IDAsXG4gIGxlZnQ6IDAsXG4gIGNlbnRlcjogMCxcbiAgcmlnaHQ6IDBcbn07XG5cbmV4cG9ydCBjbGFzcyBPdmVydmlld1J1bGVyUmVuZGVyZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbG9yWm9uZVN0b3JlOiBJQ29sb3Jab25lU3RvcmUgPSBuZXcgQ29sb3Jab25lU3RvcmUoKTtcbiAgcHJpdmF0ZSBnZXQgX3dpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMub3ZlcnZpZXdSdWxlcldpZHRoIHx8IDA7XG4gIH1cbiAgcHJpdmF0ZSBfYW5pbWF0aW9uRnJhbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9zaG91bGRVcGRhdGVEaW1lbnNpb25zOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfc2hvdWxkVXBkYXRlQW5jaG9yOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfbGFzdEtub3duQnVmZmVyTGVuZ3RoOiBudW1iZXIgPSAwO1xuXG4gIHByaXZhdGUgX2NvbnRhaW5lckhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc2NyZWVuRWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJRGVjb3JhdGlvblNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfZGVjb3JhdGlvblNlcnZpY2U6IElEZWNvcmF0aW9uU2VydmljZSxcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJQ29yZUJyb3dzZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVCcm93c2VyU2VydmljZTogSUNvcmVCcm93c2VyU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2NhbnZhcyA9IHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5tYWluRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5fY2FudmFzLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWRlY29yYXRpb24tb3ZlcnZpZXctcnVsZXInKTtcbiAgICB0aGlzLl9yZWZyZXNoQ2FudmFzRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUodGhpcy5fY2FudmFzLCB0aGlzLl92aWV3cG9ydEVsZW1lbnQpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuX2NhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0N0eCBjYW5ub3QgYmUgbnVsbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdHggPSBjdHg7XG4gICAgfVxuICAgIHRoaXMuX3JlZ2lzdGVyRGVjb3JhdGlvbkxpc3RlbmVycygpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQnVmZmVyQ2hhbmdlTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEaW1lbnNpb25DaGFuZ2VMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jYW52YXM/LnJlbW92ZSgpO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBkZWNvcmF0aW9uIGFkZCBvciByZW1vdmUsIHJlZHJhd1xuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEZWNvcmF0aW9uTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVnaXN0ZXJlZCgoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2godW5kZWZpbmVkLCB0cnVlKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVtb3ZlZCgoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2godW5kZWZpbmVkLCB0cnVlKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIGJ1ZmZlciBjaGFuZ2UsIHJlZHJhd1xuICAgKiBhbmQgaGlkZSB0aGUgY2FudmFzIGlmIHRoZSBhbHQgYnVmZmVyIGlzIGFjdGl2ZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJCdWZmZXJDaGFuZ2VMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9yZW5kZXJTZXJ2aWNlLm9uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSgoKSA9PiB0aGlzLl9xdWV1ZVJlZnJlc2goKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoKCkgPT4ge1xuICAgICAgdGhpcy5fY2FudmFzIS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIgPT09IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hbHQgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2Uub25TY3JvbGwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2xhc3RLbm93bkJ1ZmZlckxlbmd0aCAhPT0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm5vcm1hbC5saW5lcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaERyYXdIZWlnaHRDb25zdGFudHMoKTtcbiAgICAgICAgdGhpcy5fcmVmcmVzaENvbG9yWm9uZVBhZGRpbmcoKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cbiAgLyoqXG4gICAqIE9uIGRpbWVuc2lvbiBjaGFuZ2UsIHVwZGF0ZSBjYW52YXMgZGltZW5zaW9uc1xuICAgKiBhbmQgdGhlbiByZWRyYXdcbiAgICovXG4gIHByaXZhdGUgX3JlZ2lzdGVyRGltZW5zaW9uQ2hhbmdlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIGNvbnRhaW5lciBoZWlnaHQgY2hhbmdlZFxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyU2VydmljZS5vblJlbmRlcigoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lckhlaWdodCB8fCB0aGlzLl9jb250YWluZXJIZWlnaHQgIT09IHRoaXMuX3NjcmVlbkVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlUmVmcmVzaCh0cnVlKTtcbiAgICAgICAgdGhpcy5fY29udGFpbmVySGVpZ2h0ID0gdGhpcy5fc2NyZWVuRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIC8vIG92ZXJ2aWV3IHJ1bGVyIHdpZHRoIGNoYW5nZWRcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uU3BlY2lmaWNPcHRpb25DaGFuZ2UoJ292ZXJ2aWV3UnVsZXJXaWR0aCcsICgpID0+IHRoaXMuX3F1ZXVlUmVmcmVzaCh0cnVlKSkpO1xuICAgIC8vIGRldmljZSBwaXhlbCByYXRpbyBjaGFuZ2VkXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uub25EcHJDaGFuZ2UoKCkgPT4gdGhpcy5fcXVldWVSZWZyZXNoKHRydWUpKSk7XG4gICAgLy8gc2V0IHRoZSBjYW52YXMgZGltZW5zaW9uc1xuICAgIHRoaXMuX3F1ZXVlUmVmcmVzaCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hEcmF3Q29uc3RhbnRzKCk6IHZvaWQge1xuICAgIC8vIHdpZHRoXG4gICAgY29uc3Qgb3V0ZXJXaWR0aCA9IE1hdGguZmxvb3IodGhpcy5fY2FudmFzLndpZHRoIC8gMyk7XG4gICAgY29uc3QgaW5uZXJXaWR0aCA9IE1hdGguY2VpbCh0aGlzLl9jYW52YXMud2lkdGggLyAzKTtcbiAgICBkcmF3V2lkdGguZnVsbCA9IHRoaXMuX2NhbnZhcy53aWR0aDtcbiAgICBkcmF3V2lkdGgubGVmdCA9IG91dGVyV2lkdGg7XG4gICAgZHJhd1dpZHRoLmNlbnRlciA9IGlubmVyV2lkdGg7XG4gICAgZHJhd1dpZHRoLnJpZ2h0ID0gb3V0ZXJXaWR0aDtcbiAgICAvLyBoZWlnaHRcbiAgICB0aGlzLl9yZWZyZXNoRHJhd0hlaWdodENvbnN0YW50cygpO1xuICAgIC8vIHhcbiAgICBkcmF3WC5mdWxsID0gMDtcbiAgICBkcmF3WC5sZWZ0ID0gMDtcbiAgICBkcmF3WC5jZW50ZXIgPSBkcmF3V2lkdGgubGVmdDtcbiAgICBkcmF3WC5yaWdodCA9IGRyYXdXaWR0aC5sZWZ0ICsgZHJhd1dpZHRoLmNlbnRlcjtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hEcmF3SGVpZ2h0Q29uc3RhbnRzKCk6IHZvaWQge1xuICAgIGRyYXdIZWlnaHQuZnVsbCA9IE1hdGgucm91bmQoMiAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgcGl4ZWxzIHBlciBsaW5lXG4gICAgY29uc3QgcGl4ZWxzUGVyTGluZSA9IHRoaXMuX2NhbnZhcy5oZWlnaHQgLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5sZW5ndGg7XG4gICAgLy8gQ2xhbXAgYWN0dWFsIHBpeGVscyB3aXRoaW4gYSByYW5nZVxuICAgIGNvbnN0IG5vbkZ1bGxIZWlnaHQgPSBNYXRoLnJvdW5kKE1hdGgubWF4KE1hdGgubWluKHBpeGVsc1BlckxpbmUsIDEyKSwgNikgKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgICBkcmF3SGVpZ2h0LmxlZnQgPSBub25GdWxsSGVpZ2h0O1xuICAgIGRyYXdIZWlnaHQuY2VudGVyID0gbm9uRnVsbEhlaWdodDtcbiAgICBkcmF3SGVpZ2h0LnJpZ2h0ID0gbm9uRnVsbEhlaWdodDtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZnJlc2hDb2xvclpvbmVQYWRkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvbG9yWm9uZVN0b3JlLnNldFBhZGRpbmcoe1xuICAgICAgZnVsbDogTWF0aC5mbG9vcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCAvICh0aGlzLl9jYW52YXMuaGVpZ2h0IC0gMSkgKiBkcmF3SGVpZ2h0LmZ1bGwpLFxuICAgICAgbGVmdDogTWF0aC5mbG9vcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCAvICh0aGlzLl9jYW52YXMuaGVpZ2h0IC0gMSkgKiBkcmF3SGVpZ2h0LmxlZnQpLFxuICAgICAgY2VudGVyOiBNYXRoLmZsb29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoIC8gKHRoaXMuX2NhbnZhcy5oZWlnaHQgLSAxKSAqIGRyYXdIZWlnaHQuY2VudGVyKSxcbiAgICAgIHJpZ2h0OiBNYXRoLmZsb29yKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmUubGluZXMubGVuZ3RoIC8gKHRoaXMuX2NhbnZhcy5oZWlnaHQgLSAxKSAqIGRyYXdIZWlnaHQucmlnaHQpXG4gICAgfSk7XG4gICAgdGhpcy5fbGFzdEtub3duQnVmZmVyTGVuZ3RoID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLm5vcm1hbC5saW5lcy5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoQ2FudmFzRGltZW5zaW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9jYW52YXMuc3R5bGUud2lkdGggPSBgJHt0aGlzLl93aWR0aH1weGA7XG4gICAgdGhpcy5fY2FudmFzLndpZHRoID0gTWF0aC5yb3VuZCh0aGlzLl93aWR0aCAqIHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5kcHIpO1xuICAgIHRoaXMuX2NhbnZhcy5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLl9zY3JlZW5FbGVtZW50LmNsaWVudEhlaWdodH1weGA7XG4gICAgdGhpcy5fY2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5fc2NyZWVuRWxlbWVudC5jbGllbnRIZWlnaHQgKiB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2UuZHByKTtcbiAgICB0aGlzLl9yZWZyZXNoRHJhd0NvbnN0YW50cygpO1xuICAgIHRoaXMuX3JlZnJlc2hDb2xvclpvbmVQYWRkaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWZyZXNoRGVjb3JhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Nob3VsZFVwZGF0ZURpbWVuc2lvbnMpIHtcbiAgICAgIHRoaXMuX3JlZnJlc2hDYW52YXNEaW1lbnNpb25zKCk7XG4gICAgfVxuICAgIHRoaXMuX2N0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5fY2FudmFzLndpZHRoLCB0aGlzLl9jYW52YXMuaGVpZ2h0KTtcbiAgICB0aGlzLl9jb2xvclpvbmVTdG9yZS5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZGVjb3JhdGlvbiBvZiB0aGlzLl9kZWNvcmF0aW9uU2VydmljZS5kZWNvcmF0aW9ucykge1xuICAgICAgdGhpcy5fY29sb3Jab25lU3RvcmUuYWRkRGVjb3JhdGlvbihkZWNvcmF0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5fY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgY29uc3Qgem9uZXMgPSB0aGlzLl9jb2xvclpvbmVTdG9yZS56b25lcztcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2Ygem9uZXMpIHtcbiAgICAgIGlmICh6b25lLnBvc2l0aW9uICE9PSAnZnVsbCcpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ29sb3Jab25lKHpvbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHpvbmUgb2Ygem9uZXMpIHtcbiAgICAgIGlmICh6b25lLnBvc2l0aW9uID09PSAnZnVsbCcpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyQ29sb3Jab25lKHpvbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zaG91bGRVcGRhdGVEaW1lbnNpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fc2hvdWxkVXBkYXRlQW5jaG9yID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9yZW5kZXJDb2xvclpvbmUoem9uZTogSUNvbG9yWm9uZSk6IHZvaWQge1xuICAgIHRoaXMuX2N0eC5maWxsU3R5bGUgPSB6b25lLmNvbG9yO1xuICAgIHRoaXMuX2N0eC5maWxsUmVjdChcbiAgICAgIC8qIHggKi8gZHJhd1hbem9uZS5wb3NpdGlvbiB8fCAnZnVsbCddLFxuICAgICAgLyogeSAqLyBNYXRoLnJvdW5kKFxuICAgICAgICAodGhpcy5fY2FudmFzLmhlaWdodCAtIDEpICogLy8gLTEgdG8gZW5zdXJlIGF0IGxlYXN0IDJweCBhcmUgYWxsb3dlZCBmb3IgZGVjb3JhdGlvbiBvbiBsYXN0IGxpbmVcbiAgICAgICAgKHpvbmUuc3RhcnRCdWZmZXJMaW5lIC8gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2ZS5saW5lcy5sZW5ndGgpIC0gZHJhd0hlaWdodFt6b25lLnBvc2l0aW9uIHx8ICdmdWxsJ10gLyAyXG4gICAgICApLFxuICAgICAgLyogdyAqLyBkcmF3V2lkdGhbem9uZS5wb3NpdGlvbiB8fCAnZnVsbCddLFxuICAgICAgLyogaCAqLyBNYXRoLnJvdW5kKFxuICAgICAgICAodGhpcy5fY2FudmFzLmhlaWdodCAtIDEpICogLy8gLTEgdG8gZW5zdXJlIGF0IGxlYXN0IDJweCBhcmUgYWxsb3dlZCBmb3IgZGVjb3JhdGlvbiBvbiBsYXN0IGxpbmVcbiAgICAgICAgKCh6b25lLmVuZEJ1ZmZlckxpbmUgLSB6b25lLnN0YXJ0QnVmZmVyTGluZSkgLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMuYWN0aXZlLmxpbmVzLmxlbmd0aCkgKyBkcmF3SGVpZ2h0W3pvbmUucG9zaXRpb24gfHwgJ2Z1bGwnXVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9xdWV1ZVJlZnJlc2godXBkYXRlQ2FudmFzRGltZW5zaW9ucz86IGJvb2xlYW4sIHVwZGF0ZUFuY2hvcj86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zaG91bGRVcGRhdGVEaW1lbnNpb25zID0gdXBkYXRlQ2FudmFzRGltZW5zaW9ucyB8fCB0aGlzLl9zaG91bGRVcGRhdGVEaW1lbnNpb25zO1xuICAgIHRoaXMuX3Nob3VsZFVwZGF0ZUFuY2hvciA9IHVwZGF0ZUFuY2hvciB8fCB0aGlzLl9zaG91bGRVcGRhdGVBbmNob3I7XG4gICAgaWYgKHRoaXMuX2FuaW1hdGlvbkZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fYW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZWZyZXNoRGVjb3JhdGlvbnMoKTtcbiAgICAgIHRoaXMuX2FuaW1hdGlvbkZyYW1lID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSwgSUNvcmVTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgQzAgfSBmcm9tICdjb21tb24vZGF0YS9Fc2NhcGVTZXF1ZW5jZXMnO1xuXG5pbnRlcmZhY2UgSVBvc2l0aW9uIHtcbiAgc3RhcnQ6IG51bWJlcjtcbiAgZW5kOiBudW1iZXI7XG59XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBmb3IgaGFuZGxpbmcgY29tcG9zaXRpb25zdGFydCwgY29tcG9zaXRpb251cGRhdGUgYW5kIGNvbXBvc2l0aW9uZW5kXG4gKiBldmVudHMsIGRpc3BsYXlpbmcgdGhlIGluLXByb2dyZXNzIGNvbXBvc2l0aW9uIHRvIHRoZSBVSSBhbmQgZm9yd2FyZGluZyB0aGUgZmluYWwgY29tcG9zaXRpb25cbiAqIHRvIHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zaXRpb25IZWxwZXIge1xuICAvKipcbiAgICogV2hldGhlciBpbnB1dCBjb21wb3NpdGlvbiBpcyBjdXJyZW50bHkgaGFwcGVuaW5nLCBlZy4gdmlhIGEgbW9iaWxlIGtleWJvYXJkLCBzcGVlY2ggaW5wdXQgb3JcbiAgICogSU1FLiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hldGhlciB0aGUgY29tcG9zaXRpb25UZXh0IHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlIFVJLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNDb21wb3Npbmc6IGJvb2xlYW47XG4gIHB1YmxpYyBnZXQgaXNDb21wb3NpbmcoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0NvbXBvc2luZzsgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCB0ZXh0YXJlYSdzIHZhbHVlIG9mIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tcG9zaXRpb25Qb3NpdGlvbjogSVBvc2l0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgY29tcG9zaXRpb24gaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgc2VudCwgc2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgY2FuY2VsIGFueVxuICAgKiBpbi1wcm9ncmVzcyBjb21wb3NpdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2lzU2VuZGluZ0NvbXBvc2l0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEYXRhIGFscmVhZHkgc2VudCBkdWUgdG8ga2V5ZG93biBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2RhdGFBbHJlYWR5U2VudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvc2l0aW9uVmlldzogSFRNTEVsZW1lbnQsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgQElSZW5kZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3JlbmRlclNlcnZpY2U6IElSZW5kZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgdGhpcy5fZGF0YUFscmVhZHlTZW50ID0gJyc7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY29tcG9zaXRpb25zdGFydCBldmVudCwgYWN0aXZhdGluZyB0aGUgY29tcG9zaXRpb24gdmlldy5cbiAgICovXG4gIHB1YmxpYyBjb21wb3NpdGlvbnN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0ID0gdGhpcy5fdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy50ZXh0Q29udGVudCA9ICcnO1xuICAgIHRoaXMuX2RhdGFBbHJlYWR5U2VudCA9ICcnO1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb21wb3NpdGlvbnVwZGF0ZSBldmVudCwgdXBkYXRpbmcgdGhlIGNvbXBvc2l0aW9uIHZpZXcuXG4gICAqIEBwYXJhbSBldiBUaGUgZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgY29tcG9zaXRpb251cGRhdGUoZXY6IFBpY2s8Q29tcG9zaXRpb25FdmVudCwgJ2RhdGEnPik6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy50ZXh0Q29udGVudCA9IGV2LmRhdGE7XG4gICAgdGhpcy51cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLmVuZCA9IHRoaXMuX3RleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBjb21wb3NpdGlvbmVuZCBldmVudCwgaGlkaW5nIHRoZSBjb21wb3NpdGlvbiB2aWV3IGFuZCBzZW5kaW5nIHRoZSBjb21wb3NpdGlvbiB0b1xuICAgKiB0aGUgaGFuZGxlci5cbiAgICovXG4gIHB1YmxpYyBjb21wb3NpdGlvbmVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9maW5hbGl6ZUNvbXBvc2l0aW9uKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGtleWRvd24gZXZlbnQsIHJvdXRpbmcgYW55IG5lY2Vzc2FyeSBldmVudHMgdG8gdGhlIENvbXBvc2l0aW9uSGVscGVyIGZ1bmN0aW9ucy5cbiAgICogQHBhcmFtIGV2IFRoZSBrZXlkb3duIGV2ZW50LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBUZXJtaW5hbCBzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyB0aGUga2V5ZG93biBldmVudC5cbiAgICovXG4gIHB1YmxpYyBrZXlkb3duKGV2OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nIHx8IHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uKSB7XG4gICAgICBpZiAoZXYua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIC8vIENvbnRpbnVlIGNvbXBvc2luZyBpZiB0aGUga2V5Q29kZSBpcyB0aGUgXCJjb21wb3NpdGlvbiBjaGFyYWN0ZXJcIlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoZXYua2V5Q29kZSA9PT0gMTYgfHwgZXYua2V5Q29kZSA9PT0gMTcgfHwgZXYua2V5Q29kZSA9PT0gMTgpIHtcbiAgICAgICAgLy8gQ29udGludWUgY29tcG9zaW5nIGlmIHRoZSBrZXlDb2RlIGlzIGEgbW9kaWZpZXIga2V5XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEZpbmlzaCBjb21wb3NpdGlvbiBpbW1lZGlhdGVseS4gVGhpcyBpcyBtYWlubHkgaGVyZSBmb3IgdGhlIGNhc2Ugd2hlcmUgZW50ZXIgaXNcbiAgICAgIC8vIHByZXNzZWQgYW5kIHRoZSBoYW5kbGVyIG5lZWRzIHRvIGJlIHRyaWdnZXJlZCBiZWZvcmUgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG4gICAgICB0aGlzLl9maW5hbGl6ZUNvbXBvc2l0aW9uKGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAoZXYua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAvLyBJZiB0aGUgXCJjb21wb3NpdGlvbiBjaGFyYWN0ZXJcIiBpcyB1c2VkIGJ1dCBnZXRzIHRvIHRoaXMgcG9pbnQgaXQgbWVhbnMgYSBub24tY29tcG9zaXRpb25cbiAgICAgIC8vIGNoYXJhY3RlciAoZWcuIG51bWJlcnMgYW5kIHB1bmN0dWF0aW9uKSB3YXMgcHJlc3NlZCB3aGVuIHRoZSBJTUUgd2FzIGFjdGl2ZS5cbiAgICAgIHRoaXMuX2hhbmRsZUFueVRleHRhcmVhQ2hhbmdlcygpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmFsaXplcyB0aGUgY29tcG9zaXRpb24sIHJlc3VtaW5nIHJlZ3VsYXIgaW5wdXQgYWN0aW9ucy4gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNvbXBvc2l0aW9uXG4gICAqIGlzIGVuZGluZy5cbiAgICogQHBhcmFtIHdhaXRGb3JQcm9wYWdhdGlvbiBXaGV0aGVyIHRvIHdhaXQgZm9yIGV2ZW50cyB0byBwcm9wYWdhdGUgYmVmb3JlIHNlbmRpbmdcbiAgICogICB0aGUgaW5wdXQuIFRoaXMgc2hvdWxkIGJlIGZhbHNlIGlmIGEgbm9uLWNvbXBvc2l0aW9uIGtleXN0cm9rZSBpcyBlbnRlcmVkIGJlZm9yZSB0aGVcbiAgICogICBjb21wb3NpdGlvbmVuZCBldmVudCBpcyB0cmlnZ2VyZWQsIHN1Y2ggYXMgZW50ZXIsIHNvIHRoYXQgdGhlIGNvbXBvc2l0aW9uIGlzIHNlbnQgYmVmb3JlXG4gICAqICAgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQuXG4gICAqL1xuICBwcml2YXRlIF9maW5hbGl6ZUNvbXBvc2l0aW9uKHdhaXRGb3JQcm9wYWdhdGlvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2NvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICB0aGlzLl9pc0NvbXBvc2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKCF3YWl0Rm9yUHJvcGFnYXRpb24pIHtcbiAgICAgIC8vIENhbmNlbCBhbnkgZGVsYXllZCBjb21wb3NpdGlvbiBzZW5kIHJlcXVlc3RzIGFuZCBzZW5kIHRoZSBpbnB1dCBpbW1lZGlhdGVseS5cbiAgICAgIHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgICBjb25zdCBpbnB1dCA9IHRoaXMuX3RleHRhcmVhLnZhbHVlLnN1YnN0cmluZyh0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LCB0aGlzLl9jb21wb3NpdGlvblBvc2l0aW9uLmVuZCk7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGlucHV0LCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTWFrZSBhIGRlZXAgY29weSBvZiB0aGUgY29tcG9zaXRpb24gcG9zaXRpb24gaGVyZSBhcyBhIG5ldyBjb21wb3NpdGlvbnN0YXJ0IGV2ZW50IG1heVxuICAgICAgLy8gZmlyZSBiZWZvcmUgdGhlIHNldFRpbWVvdXQgZXhlY3V0ZXMuXG4gICAgICBjb25zdCBjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbiA9IHtcbiAgICAgICAgc3RhcnQ6IHRoaXMuX2NvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsXG4gICAgICAgIGVuZDogdGhpcy5fY29tcG9zaXRpb25Qb3NpdGlvbi5lbmRcbiAgICAgIH07XG5cbiAgICAgIC8vIFNpbmNlIGNvbXBvc2l0aW9uKiBldmVudHMgaGFwcGVuIGJlZm9yZSB0aGUgY2hhbmdlcyB0YWtlIHBsYWNlIGluIHRoZSB0ZXh0YXJlYSBvbiBtb3N0XG4gICAgICAvLyBicm93c2VycywgdXNlIGEgc2V0VGltZW91dCB3aXRoIDBtcyB0aW1lIHRvIGFsbG93IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgdG9cbiAgICAgIC8vIGNvbXBsZXRlLiBUaGlzIGVuc3VyZXMgdGhlIGNvcnJlY3QgY2hhcmFjdGVyIGlzIHJldHJpZXZlZC5cbiAgICAgIC8vIFRoaXMgc29sdXRpb24gd2FzIHVzZWQgYmVjYXVzZTpcbiAgICAgIC8vIC0gVGhlIGNvbXBvc2l0aW9uZW5kIGV2ZW50J3MgZGF0YSBwcm9wZXJ0eSBpcyB1bnJlbGlhYmxlLCBhdCBsZWFzdCBvbiBDaHJvbWl1bVxuICAgICAgLy8gLSBUaGUgbGFzdCBjb21wb3NpdGlvbnVwZGF0ZSBldmVudCdzIGRhdGEgcHJvcGVydHkgZG9lcyBub3QgYWx3YXlzIGFjY3VyYXRlbHkgZGVzY3JpYmVcbiAgICAgIC8vICAgdGhlIGNoYXJhY3RlciwgYSBjb3VudGVyIGV4YW1wbGUgYmVpbmcgS29yZWFuIHdoZXJlIGFuIGVuZGluZyBjb25zb25zYW50IGNhbiBtb3ZlIHRvXG4gICAgICAvLyAgIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlmIHRoZSBmb2xsb3dpbmcgaW5wdXQgaXMgYSB2b3dlbC5cbiAgICAgIHRoaXMuX2lzU2VuZGluZ0NvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaW5wdXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gc2VudFxuICAgICAgICBpZiAodGhpcy5faXNTZW5kaW5nQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICB0aGlzLl9pc1NlbmRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgIGxldCBpbnB1dDtcbiAgICAgICAgICAvLyBBZGQgbGVuZ3RoIG9mIGRhdGEgYWxyZWFkeSBzZW50IGR1ZSB0byBrZXlkb3duIGV2ZW50LFxuICAgICAgICAgIC8vIG90aGVyd2lzZSBpbnB1dCBjaGFyYWN0ZXJzIGNhbiBiZSBkdXBsaWNhdGVkLiAoSXNzdWUgIzMxOTEpXG4gICAgICAgICAgY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQgKz0gdGhpcy5fZGF0YUFscmVhZHlTZW50Lmxlbmd0aDtcbiAgICAgICAgICBpZiAodGhpcy5faXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgZW5kIHBvc2l0aW9uIHRvIGdldCB0aGUgc3RyaW5nIGlmIGEgbmV3IGNvbXBvc2l0aW9uIGhhcyBzdGFydGVkLlxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsIGN1cnJlbnRDb21wb3NpdGlvblBvc2l0aW9uLmVuZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERvbid0IHVzZSB0aGUgZW5kIHBvc2l0aW9uIGhlcmUgaW4gb3JkZXIgdG8gcGljayB1cCBhbnkgY2hhcmFjdGVycyBhZnRlciB0aGVcbiAgICAgICAgICAgIC8vIGNvbXBvc2l0aW9uIGhhcyBmaW5pc2hlZCwgZm9yIGV4YW1wbGUgd2hlbiB0eXBpbmcgYSBub24tY29tcG9zaXRpb24gY2hhcmFjdGVyXG4gICAgICAgICAgICAvLyAoZWcuIDIpIGFmdGVyIGEgY29tcG9zaXRpb24gY2hhcmFjdGVyLlxuICAgICAgICAgICAgaW5wdXQgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChpbnB1dCwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgdGV4dGFyZWEgYWZ0ZXIgdGhlIGN1cnJlbnQgZXZlbnQgY2hhaW4gaXMgYWxsb3dlZCB0byBjb21wbGV0ZS5cbiAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gbm90IGN1cnJlbnRseSBjb21wb3NpbmcgYnV0IGEga2V5ZG93biBldmVudCB3aXRoIHRoZSBcImNvbXBvc2l0aW9uXG4gICAqIGNoYXJhY3RlclwiICgyMjkpIGlzIHRyaWdnZXJlZCwgaW4gb3JkZXIgdG8gYWxsb3cgbm9uLWNvbXBvc2l0aW9uIHRleHQgdG8gYmUgZW50ZXJlZCB3aGVuIGFuXG4gICAqIElNRSBpcyBhY3RpdmUuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl90ZXh0YXJlYS52YWx1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBpZiBhIGNvbXBvc2l0aW9uIGhhcyBzdGFydGVkIHNpbmNlIHRoZSB0aW1lb3V0XG4gICAgICBpZiAoIXRoaXMuX2lzQ29tcG9zaW5nKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5fdGV4dGFyZWEudmFsdWU7XG5cbiAgICAgICAgY29uc3QgZGlmZiA9IG5ld1ZhbHVlLnJlcGxhY2Uob2xkVmFsdWUsICcnKTtcblxuICAgICAgICB0aGlzLl9kYXRhQWxyZWFkeVNlbnQgPSBkaWZmO1xuXG4gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPiBvbGRWYWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGRpZmYsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlLmxlbmd0aCA8IG9sZFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuREVMfWAsIHRydWUpO1xuICAgICAgICB9IGVsc2UgaWYgKChuZXdWYWx1ZS5sZW5ndGggPT09IG9sZFZhbHVlLmxlbmd0aCkgJiYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KG5ld1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogUG9zaXRpb25zIHRoZSBjb21wb3NpdGlvbiB2aWV3IG9uIHRvcCBvZiB0aGUgY3Vyc29yIGFuZCB0aGUgdGV4dGFyZWEganVzdCBiZWxvdyBpdCAoc28gdGhlXG4gICAqIElNRSBoZWxwZXIgZGlhbG9nIGlzIHBvc2l0aW9uZWQgY29ycmVjdGx5KS5cbiAgICogQHBhcmFtIGRvbnRSZWN1cnNlIFdoZXRoZXIgdG8gdXNlIHNldFRpbWVvdXQgdG8gcmVjdXJzaXZlbHkgdHJpZ2dlciBhbm90aGVyIHVwZGF0ZSwgdGhpcyBpc1xuICAgKiAgIG5lY2Vzc2FyeSBhcyB0aGUgSU1FIGV2ZW50cyBhY3Jvc3MgYnJvd3NlcnMgYXJlIG5vdCBjb25zaXN0ZW50bHkgdHJpZ2dlcmVkLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMoZG9udFJlY3Vyc2U/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0NvbXBvc2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5pc0N1cnNvckluVmlld3BvcnQpIHtcbiAgICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci54LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKTtcblxuICAgICAgY29uc3QgY2VsbEhlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQ7XG4gICAgICBjb25zdCBjdXJzb3JUb3AgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodDtcbiAgICAgIGNvbnN0IGN1cnNvckxlZnQgPSBjdXJzb3JYICogdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoO1xuXG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUubGVmdCA9IGN1cnNvckxlZnQgKyAncHgnO1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUuaGVpZ2h0ID0gY2VsbEhlaWdodCArICdweCc7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUubGluZUhlaWdodCA9IGNlbGxIZWlnaHQgKyAncHgnO1xuICAgICAgdGhpcy5fY29tcG9zaXRpb25WaWV3LnN0eWxlLmZvbnRGYW1pbHkgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHk7XG4gICAgICB0aGlzLl9jb21wb3NpdGlvblZpZXcuc3R5bGUuZm9udFNpemUgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplICsgJ3B4JztcbiAgICAgIC8vIFN5bmMgdGhlIHRleHRhcmVhIHRvIHRoZSBleGFjdCBwb3NpdGlvbiBvZiB0aGUgY29tcG9zaXRpb24gdmlldyBzbyB0aGUgSU1FIGtub3dzIHdoZXJlIHRoZVxuICAgICAgLy8gdGV4dCBpcy5cbiAgICAgIGNvbnN0IGNvbXBvc2l0aW9uVmlld0JvdW5kcyA9IHRoaXMuX2NvbXBvc2l0aW9uVmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMuX3RleHRhcmVhLnN0eWxlLmxlZnQgPSBjdXJzb3JMZWZ0ICsgJ3B4JztcbiAgICAgIHRoaXMuX3RleHRhcmVhLnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgICAvLyBFbnN1cmUgdGhlIHRleHQgYXJlYSBpcyBhdCBsZWFzdCAxeDEsIG90aGVyd2lzZSBjZXJ0YWluIElNRXMgbWF5IGJyZWFrXG4gICAgICB0aGlzLl90ZXh0YXJlYS5zdHlsZS53aWR0aCA9IE1hdGgubWF4KGNvbXBvc2l0aW9uVmlld0JvdW5kcy53aWR0aCwgMSkgKyAncHgnO1xuICAgICAgdGhpcy5fdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoY29tcG9zaXRpb25WaWV3Qm91bmRzLmhlaWdodCwgMSkgKyAncHgnO1xuICAgICAgdGhpcy5fdGV4dGFyZWEuc3R5bGUubGluZUhlaWdodCA9IGNvbXBvc2l0aW9uVmlld0JvdW5kcy5oZWlnaHQgKyAncHgnO1xuICAgIH1cblxuICAgIGlmICghZG9udFJlY3Vyc2UpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzKHRydWUpLCAwKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50KHdpbmRvdzogUGljazxXaW5kb3csICdnZXRDb21wdXRlZFN0eWxlJz4sIGV2ZW50OiB7Y2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXJ9LCBlbGVtZW50OiBIVE1MRWxlbWVudCk6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gIGNvbnN0IGxlZnRQYWRkaW5nID0gcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKTtcbiAgY29uc3QgdG9wUGFkZGluZyA9IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKTtcbiAgcmV0dXJuIFtcbiAgICBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbGVmdFBhZGRpbmcsXG4gICAgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gdG9wUGFkZGluZ1xuICBdO1xufVxuXG4vKipcbiAqIEdldHMgY29vcmRpbmF0ZXMgd2l0aGluIHRoZSB0ZXJtaW5hbCBmb3IgYSBwYXJ0aWN1bGFyIG1vdXNlIGV2ZW50LiBUaGUgcmVzdWx0XG4gKiBpcyByZXR1cm5lZCBhcyBhbiBhcnJheSBpbiB0aGUgZm9ybSBbeCwgeV0gaW5zdGVhZCBvZiBhbiBvYmplY3QgYXMgaXQncyBhXG4gKiBsaXR0bGUgZmFzdGVyIGFuZCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gc29tZSBsb3cgbGV2ZWwgY29kZS5cbiAqIEBwYXJhbSB3aW5kb3cgVGhlIHdpbmRvdyBvYmplY3QgdGhlIGVsZW1lbnQgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gKiBAcGFyYW0gZWxlbWVudCBUaGUgdGVybWluYWwncyBjb250YWluZXIgZWxlbWVudC5cbiAqIEBwYXJhbSBjb2xDb3VudCBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRlcm1pbmFsLlxuICogQHBhcmFtIHJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBuIHRoZSB0ZXJtaW5hbC5cbiAqIEBwYXJhbSBoYXNWYWxpZENoYXJTaXplIFdoZXRoZXIgdGhlcmUgaXMgYSB2YWxpZCBjaGFyYWN0ZXIgc2l6ZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0gY3NzQ2VsbFdpZHRoIFRoZSBjZWxsIHdpZHRoIGRldmljZSBwaXhlbCByZW5kZXIgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBjc3NDZWxsSGVpZ2h0IFRoZSBjZWxsIGhlaWdodCBkZXZpY2UgcGl4ZWwgcmVuZGVyIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0gaXNTZWxlY3Rpb24gV2hldGhlciB0aGUgcmVxdWVzdCBpcyBmb3IgdGhlIHNlbGVjdGlvbiBvciBub3QuIFRoaXMgd2lsbFxuICogYXBwbHkgYW4gb2Zmc2V0IHRvIHRoZSB4IHZhbHVlIHN1Y2ggdGhhdCB0aGUgbGVmdCBoYWxmIG9mIHRoZSBjZWxsIHdpbGxcbiAqIHNlbGVjdCB0aGF0IGNlbGwgYW5kIHRoZSByaWdodCBoYWxmIHdpbGwgc2VsZWN0IHRoZSBuZXh0IGNlbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHMod2luZG93OiBQaWNrPFdpbmRvdywgJ2dldENvbXB1dGVkU3R5bGUnPiwgZXZlbnQ6IFBpY2s8TW91c2VFdmVudCwgJ2NsaWVudFgnIHwgJ2NsaWVudFknPiwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbENvdW50OiBudW1iZXIsIHJvd0NvdW50OiBudW1iZXIsIGhhc1ZhbGlkQ2hhclNpemU6IGJvb2xlYW4sIGNzc0NlbGxXaWR0aDogbnVtYmVyLCBjc3NDZWxsSGVpZ2h0OiBudW1iZXIsIGlzU2VsZWN0aW9uPzogYm9vbGVhbik6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAvLyBDb29yZGluYXRlcyBjYW5ub3QgYmUgbWVhc3VyZWQgaWYgdGhlcmUgYXJlIG5vIHZhbGlkXG4gIGlmICghaGFzVmFsaWRDaGFyU2l6ZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb29yZHMgPSBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCh3aW5kb3csIGV2ZW50LCBlbGVtZW50KTtcbiAgaWYgKCFjb29yZHMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29vcmRzWzBdID0gTWF0aC5jZWlsKChjb29yZHNbMF0gKyAoaXNTZWxlY3Rpb24gPyBjc3NDZWxsV2lkdGggLyAyIDogMCkpIC8gY3NzQ2VsbFdpZHRoKTtcbiAgY29vcmRzWzFdID0gTWF0aC5jZWlsKGNvb3Jkc1sxXSAvIGNzc0NlbGxIZWlnaHQpO1xuXG4gIC8vIEVuc3VyZSBjb29yZGluYXRlcyBhcmUgd2l0aGluIHRoZSB0ZXJtaW5hbCB2aWV3cG9ydC4gTm90ZSB0aGF0IHNlbGVjdGlvbnNcbiAgLy8gbmVlZCBhbiBhZGRpdGlvbiBwb2ludCBvZiBwcmVjaXNpb24gdG8gY292ZXIgdGhlIGVuZCBwb2ludCAoYXMgY2hhcmFjdGVyc1xuICAvLyBjb3ZlciBoYWxmIG9mIG9uZSBjaGFyIGFuZCBoYWxmIG9mIHRoZSBuZXh0KS5cbiAgY29vcmRzWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoY29vcmRzWzBdLCAxKSwgY29sQ291bnQgKyAoaXNTZWxlY3Rpb24gPyAxIDogMCkpO1xuICBjb29yZHNbMV0gPSBNYXRoLm1pbihNYXRoLm1heChjb29yZHNbMV0sIDEpLCByb3dDb3VudCk7XG5cbiAgcmV0dXJuIGNvb3Jkcztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQzAgfSBmcm9tICdjb21tb24vZGF0YS9Fc2NhcGVTZXF1ZW5jZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBlbnVtIERpcmVjdGlvbiB7XG4gIFVQID0gJ0EnLFxuICBET1dOID0gJ0InLFxuICBSSUdIVCA9ICdDJyxcbiAgTEVGVCA9ICdEJ1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhbGwgdGhlIGFycm93IHNlcXVlbmNlcyB0b2dldGhlci5cbiAqIFJlc2V0cyB0aGUgc3RhcnRpbmcgcm93IHRvIGFuIHVud3JhcHBlZCByb3csIG1vdmVzIHRvIHRoZSByZXF1ZXN0ZWQgcm93LFxuICogdGhlbiBtb3ZlcyB0byByZXF1ZXN0ZWQgY29sLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZVRvQ2VsbFNlcXVlbmNlKHRhcmdldFg6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3I6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBzdGFydFggPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci54O1xuICBjb25zdCBzdGFydFkgPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci55O1xuXG4gIC8vIFRoZSBhbHQgYnVmZmVyIHNob3VsZCB0cnkgdG8gbmF2aWdhdGUgYmV0d2VlbiByb3dzXG4gIGlmICghYnVmZmVyU2VydmljZS5idWZmZXIuaGFzU2Nyb2xsYmFjaykge1xuICAgIHJldHVybiByZXNldFN0YXJ0aW5nUm93KHN0YXJ0WCwgc3RhcnRZLCB0YXJnZXRYLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcikgK1xuICAgICAgbW92ZVRvUmVxdWVzdGVkUm93KHN0YXJ0WSwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpICtcbiAgICAgIG1vdmVUb1JlcXVlc3RlZENvbChzdGFydFgsIHN0YXJ0WSwgdGFyZ2V0WCwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpO1xuICB9XG5cbiAgLy8gT25seSBtb3ZlIGhvcml6b250YWxseSBmb3IgdGhlIG5vcm1hbCBidWZmZXJcbiAgbGV0IGRpcmVjdGlvbjtcbiAgaWYgKHN0YXJ0WSA9PT0gdGFyZ2V0WSkge1xuICAgIGRpcmVjdGlvbiA9IHN0YXJ0WCA+IHRhcmdldFggPyBEaXJlY3Rpb24uTEVGVCA6IERpcmVjdGlvbi5SSUdIVDtcbiAgICByZXR1cm4gcmVwZWF0KE1hdGguYWJzKHN0YXJ0WCAtIHRhcmdldFgpLCBzZXF1ZW5jZShkaXJlY3Rpb24sIGFwcGxpY2F0aW9uQ3Vyc29yKSk7XG4gIH1cbiAgZGlyZWN0aW9uID0gc3RhcnRZID4gdGFyZ2V0WSA/IERpcmVjdGlvbi5MRUZUIDogRGlyZWN0aW9uLlJJR0hUO1xuICBjb25zdCByb3dEaWZmZXJlbmNlID0gTWF0aC5hYnMoc3RhcnRZIC0gdGFyZ2V0WSk7XG4gIGNvbnN0IGNlbGxzVG9Nb3ZlID0gY29sc0Zyb21Sb3dFbmQoc3RhcnRZID4gdGFyZ2V0WSA/IHRhcmdldFggOiBzdGFydFgsIGJ1ZmZlclNlcnZpY2UpICtcbiAgICAocm93RGlmZmVyZW5jZSAtIDEpICogYnVmZmVyU2VydmljZS5jb2xzICsgMSAvKiB3cmFwIGFyb3VuZCAxIHJvdyAqLyArXG4gICAgY29sc0Zyb21Sb3dCZWdpbm5pbmcoc3RhcnRZID4gdGFyZ2V0WSA/IHN0YXJ0WCA6IHRhcmdldFgsIGJ1ZmZlclNlcnZpY2UpO1xuICByZXR1cm4gcmVwZWF0KGNlbGxzVG9Nb3ZlLCBzZXF1ZW5jZShkaXJlY3Rpb24sIGFwcGxpY2F0aW9uQ3Vyc29yKSk7XG59XG5cbi8qKlxuICogRmluZCB0aGUgbnVtYmVyIG9mIGNvbHMgZnJvbSBhIHJvdyBiZWdpbm5pbmcgdG8gYSBjb2wuXG4gKi9cbmZ1bmN0aW9uIGNvbHNGcm9tUm93QmVnaW5uaW5nKGN1cnJYOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGN1cnJYIC0gMTtcbn1cblxuLyoqXG4gKiBGaW5kIHRoZSBudW1iZXIgb2YgY29scyBmcm9tIGEgY29sIHRvIHJvdyBlbmQuXG4gKi9cbmZ1bmN0aW9uIGNvbHNGcm9tUm93RW5kKGN1cnJYOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlKTogbnVtYmVyIHtcbiAgcmV0dXJuIGJ1ZmZlclNlcnZpY2UuY29scyAtIGN1cnJYO1xufVxuXG4vKipcbiAqIElmIHRoZSBpbml0aWFsIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgaXMgb24gYSByb3cgdGhhdCBpcyB3cmFwcGVkLCBtb3ZlIHRoZVxuICogY3Vyc29yIHVwIHRvIHRoZSBmaXJzdCByb3cgdGhhdCBpcyBub3Qgd3JhcHBlZCB0byBoYXZlIGFjY3VyYXRlIHZlcnRpY2FsXG4gKiBwb3NpdGlvbmluZy5cbiAqL1xuZnVuY3Rpb24gcmVzZXRTdGFydGluZ1JvdyhzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHRhcmdldFg6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3I6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAobW92ZVRvUmVxdWVzdGVkUm93KHN0YXJ0WSwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gcmVwZWF0KGJ1ZmZlckxpbmUoXG4gICAgc3RhcnRYLCBzdGFydFksIHN0YXJ0WCxcbiAgICBzdGFydFkgLSB3cmFwcGVkUm93c0ZvclJvdyhzdGFydFksIGJ1ZmZlclNlcnZpY2UpLCBmYWxzZSwgYnVmZmVyU2VydmljZVxuICApLmxlbmd0aCwgc2VxdWVuY2UoRGlyZWN0aW9uLkxFRlQsIGFwcGxpY2F0aW9uQ3Vyc29yKSk7XG59XG5cbi8qKlxuICogVXNpbmcgdGhlIHJlc2V0IHN0YXJ0aW5nIGFuZCBlbmRpbmcgcm93LCBtb3ZlIHRvIHRoZSByZXF1ZXN0ZWQgcm93LFxuICogaWdub3Jpbmcgd3JhcHBlZCByb3dzXG4gKi9cbmZ1bmN0aW9uIG1vdmVUb1JlcXVlc3RlZFJvdyhzdGFydFk6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3I6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBzdGFydFJvdyA9IHN0YXJ0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHN0YXJ0WSwgYnVmZmVyU2VydmljZSk7XG4gIGNvbnN0IGVuZFJvdyA9IHRhcmdldFkgLSB3cmFwcGVkUm93c0ZvclJvdyh0YXJnZXRZLCBidWZmZXJTZXJ2aWNlKTtcblxuICBjb25zdCByb3dzVG9Nb3ZlID0gTWF0aC5hYnMoc3RhcnRSb3cgLSBlbmRSb3cpIC0gd3JhcHBlZFJvd3NDb3VudChzdGFydFksIHRhcmdldFksIGJ1ZmZlclNlcnZpY2UpO1xuXG4gIHJldHVybiByZXBlYXQocm93c1RvTW92ZSwgc2VxdWVuY2UodmVydGljYWxEaXJlY3Rpb24oc3RhcnRZLCB0YXJnZXRZKSwgYXBwbGljYXRpb25DdXJzb3IpKTtcbn1cblxuLyoqXG4gKiBNb3ZlIHRvIHRoZSByZXF1ZXN0ZWQgY29sIG9uIHRoZSBlbmRpbmcgcm93XG4gKi9cbmZ1bmN0aW9uIG1vdmVUb1JlcXVlc3RlZENvbChzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIHRhcmdldFg6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3I6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBsZXQgc3RhcnRSb3c7XG4gIGlmIChtb3ZlVG9SZXF1ZXN0ZWRSb3coc3RhcnRZLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcikubGVuZ3RoID4gMCkge1xuICAgIHN0YXJ0Um93ID0gdGFyZ2V0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHRhcmdldFksIGJ1ZmZlclNlcnZpY2UpO1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0Um93ID0gc3RhcnRZO1xuICB9XG5cbiAgY29uc3QgZW5kUm93ID0gdGFyZ2V0WTtcbiAgY29uc3QgZGlyZWN0aW9uID0gaG9yaXpvbnRhbERpcmVjdGlvbihzdGFydFgsIHN0YXJ0WSwgdGFyZ2V0WCwgdGFyZ2V0WSwgYnVmZmVyU2VydmljZSwgYXBwbGljYXRpb25DdXJzb3IpO1xuXG4gIHJldHVybiByZXBlYXQoYnVmZmVyTGluZShcbiAgICBzdGFydFgsIHN0YXJ0Um93LCB0YXJnZXRYLCBlbmRSb3csXG4gICAgZGlyZWN0aW9uID09PSBEaXJlY3Rpb24uUklHSFQsIGJ1ZmZlclNlcnZpY2VcbiAgKS5sZW5ndGgsIHNlcXVlbmNlKGRpcmVjdGlvbiwgYXBwbGljYXRpb25DdXJzb3IpKTtcbn1cblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZWQgcm93cyBiZXR3ZWVuIHRoZSB1bndyYXBwZWQgc3RhcnRpbmcgYW5kXG4gKiBlbmRpbmcgcm93cy4gVGhlc2Ugcm93cyBuZWVkIHRvIGlnbm9yZWQgc2luY2UgdGhlIGN1cnNvciBza2lwcyBvdmVyIHRoZW0uXG4gKi9cbmZ1bmN0aW9uIHdyYXBwZWRSb3dzQ291bnQoc3RhcnRZOiBudW1iZXIsIHRhcmdldFk6IG51bWJlciwgYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UpOiBudW1iZXIge1xuICBsZXQgd3JhcHBlZFJvd3MgPSAwO1xuICBjb25zdCBzdGFydFJvdyA9IHN0YXJ0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHN0YXJ0WSwgYnVmZmVyU2VydmljZSk7XG4gIGNvbnN0IGVuZFJvdyA9IHRhcmdldFkgLSB3cmFwcGVkUm93c0ZvclJvdyh0YXJnZXRZLCBidWZmZXJTZXJ2aWNlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguYWJzKHN0YXJ0Um93IC0gZW5kUm93KTsgaSsrKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gdmVydGljYWxEaXJlY3Rpb24oc3RhcnRZLCB0YXJnZXRZKSA9PT0gRGlyZWN0aW9uLlVQID8gLTEgOiAxO1xuICAgIGNvbnN0IGxpbmUgPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQoc3RhcnRSb3cgKyAoZGlyZWN0aW9uICogaSkpO1xuICAgIGlmIChsaW5lPy5pc1dyYXBwZWQpIHtcbiAgICAgIHdyYXBwZWRSb3dzKys7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdyYXBwZWRSb3dzO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiB3cmFwcGVkIHJvd3MgdGhhdCBtYWtlIHVwIGEgZ2l2ZW4gcm93LlxuICogQHBhcmFtIGN1cnJlbnRSb3cgVGhlIHJvdyB0byBkZXRlcm1pbmUgaG93IG1hbnkgd3JhcHBlZCByb3dzIG1ha2UgaXQgdXBcbiAqL1xuZnVuY3Rpb24gd3JhcHBlZFJvd3NGb3JSb3coY3VycmVudFJvdzogbnVtYmVyLCBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSk6IG51bWJlciB7XG4gIGxldCByb3dDb3VudCA9IDA7XG4gIGxldCBsaW5lID0gYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KGN1cnJlbnRSb3cpO1xuICBsZXQgbGluZVdyYXBzID0gbGluZT8uaXNXcmFwcGVkO1xuXG4gIHdoaWxlIChsaW5lV3JhcHMgJiYgY3VycmVudFJvdyA+PSAwICYmIGN1cnJlbnRSb3cgPCBidWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICByb3dDb3VudCsrO1xuICAgIGxpbmUgPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQoLS1jdXJyZW50Um93KTtcbiAgICBsaW5lV3JhcHMgPSBsaW5lPy5pc1dyYXBwZWQ7XG4gIH1cblxuICByZXR1cm4gcm93Q291bnQ7XG59XG5cbi8qKlxuICogRGlyZWN0aW9uIGRldGVybWluZXJzXG4gKi9cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSByaWdodCBvciBsZWZ0IGFycm93IGlzIG5lZWRlZFxuICovXG5mdW5jdGlvbiBob3Jpem9udGFsRGlyZWN0aW9uKHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgdGFyZ2V0WDogbnVtYmVyLCB0YXJnZXRZOiBudW1iZXIsIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcjogYm9vbGVhbik6IERpcmVjdGlvbiB7XG4gIGxldCBzdGFydFJvdztcbiAgaWYgKG1vdmVUb1JlcXVlc3RlZFJvdyh0YXJnZXRYLCB0YXJnZXRZLCBidWZmZXJTZXJ2aWNlLCBhcHBsaWNhdGlvbkN1cnNvcikubGVuZ3RoID4gMCkge1xuICAgIHN0YXJ0Um93ID0gdGFyZ2V0WSAtIHdyYXBwZWRSb3dzRm9yUm93KHRhcmdldFksIGJ1ZmZlclNlcnZpY2UpO1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0Um93ID0gc3RhcnRZO1xuICB9XG5cbiAgaWYgKChzdGFydFggPCB0YXJnZXRYICYmXG4gICAgc3RhcnRSb3cgPD0gdGFyZ2V0WSkgfHwgLy8gZG93bi9yaWdodCBvciBzYW1lIHkvcmlnaHRcbiAgICAoc3RhcnRYID49IHRhcmdldFggJiZcbiAgICBzdGFydFJvdyA8IHRhcmdldFkpKSB7ICAvLyBkb3duL2xlZnQgb3Igc2FtZSB5L2xlZnRcbiAgICByZXR1cm4gRGlyZWN0aW9uLlJJR0hUO1xuICB9XG4gIHJldHVybiBEaXJlY3Rpb24uTEVGVDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSB1cCBvciBkb3duIGFycm93IGlzIG5lZWRlZFxuICovXG5mdW5jdGlvbiB2ZXJ0aWNhbERpcmVjdGlvbihzdGFydFk6IG51bWJlciwgdGFyZ2V0WTogbnVtYmVyKTogRGlyZWN0aW9uIHtcbiAgcmV0dXJuIHN0YXJ0WSA+IHRhcmdldFkgPyBEaXJlY3Rpb24uVVAgOiBEaXJlY3Rpb24uRE9XTjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIHRoZSBzdHJpbmcgb2YgY2hhcnMgaW4gdGhlIGJ1ZmZlciBmcm9tIGEgc3RhcnRpbmcgcm93IGFuZCBjb2xcbiAqIHRvIGFuIGVuZGluZyByb3cgYW5kIGNvbFxuICogQHBhcmFtIHN0YXJ0Q29sIFRoZSBzdGFydGluZyBjb2x1bW4gcG9zaXRpb25cbiAqIEBwYXJhbSBzdGFydFJvdyBUaGUgc3RhcnRpbmcgcm93IHBvc2l0aW9uXG4gKiBAcGFyYW0gZW5kQ29sIFRoZSBlbmRpbmcgY29sdW1uIHBvc2l0aW9uXG4gKiBAcGFyYW0gZW5kUm93IFRoZSBlbmRpbmcgcm93IHBvc2l0aW9uXG4gKiBAcGFyYW0gZm9yd2FyZCBEaXJlY3Rpb24gdG8gbW92ZVxuICovXG5mdW5jdGlvbiBidWZmZXJMaW5lKFxuICBzdGFydENvbDogbnVtYmVyLFxuICBzdGFydFJvdzogbnVtYmVyLFxuICBlbmRDb2w6IG51bWJlcixcbiAgZW5kUm93OiBudW1iZXIsXG4gIGZvcndhcmQ6IGJvb2xlYW4sXG4gIGJ1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4pOiBzdHJpbmcge1xuICBsZXQgY3VycmVudENvbCA9IHN0YXJ0Q29sO1xuICBsZXQgY3VycmVudFJvdyA9IHN0YXJ0Um93O1xuICBsZXQgYnVmZmVyU3RyID0gJyc7XG5cbiAgd2hpbGUgKGN1cnJlbnRDb2wgIT09IGVuZENvbCB8fCBjdXJyZW50Um93ICE9PSBlbmRSb3cpIHtcbiAgICBjdXJyZW50Q29sICs9IGZvcndhcmQgPyAxIDogLTE7XG5cbiAgICBpZiAoZm9yd2FyZCAmJiBjdXJyZW50Q29sID4gYnVmZmVyU2VydmljZS5jb2xzIC0gMSkge1xuICAgICAgYnVmZmVyU3RyICs9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhcbiAgICAgICAgY3VycmVudFJvdywgZmFsc2UsIHN0YXJ0Q29sLCBjdXJyZW50Q29sXG4gICAgICApO1xuICAgICAgY3VycmVudENvbCA9IDA7XG4gICAgICBzdGFydENvbCA9IDA7XG4gICAgICBjdXJyZW50Um93Kys7XG4gICAgfSBlbHNlIGlmICghZm9yd2FyZCAmJiBjdXJyZW50Q29sIDwgMCkge1xuICAgICAgYnVmZmVyU3RyICs9IGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhcbiAgICAgICAgY3VycmVudFJvdywgZmFsc2UsIDAsIHN0YXJ0Q29sICsgMVxuICAgICAgKTtcbiAgICAgIGN1cnJlbnRDb2wgPSBidWZmZXJTZXJ2aWNlLmNvbHMgLSAxO1xuICAgICAgc3RhcnRDb2wgPSBjdXJyZW50Q29sO1xuICAgICAgY3VycmVudFJvdy0tO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBidWZmZXJTdHIgKyBidWZmZXJTZXJ2aWNlLmJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoXG4gICAgY3VycmVudFJvdywgZmFsc2UsIHN0YXJ0Q29sLCBjdXJyZW50Q29sXG4gICk7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyB0aGUgZXNjYXBlIHNlcXVlbmNlIGZvciBjbGlja2luZyBhbiBhcnJvd1xuICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRvIG1vdmVcbiAqL1xuZnVuY3Rpb24gc2VxdWVuY2UoZGlyZWN0aW9uOiBEaXJlY3Rpb24sIGFwcGxpY2F0aW9uQ3Vyc29yOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgbW9kID0gIGFwcGxpY2F0aW9uQ3Vyc29yID8gJ08nIDogJ1snO1xuICByZXR1cm4gQzAuRVNDICsgbW9kICsgZGlyZWN0aW9uO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwZWF0ZWQgYSBnaXZlbiBudW1iZXIgb2YgdGltZXNcbiAqIFBvbHlmaWxsIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3RyaW5nL3JlcGVhdFxuICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBzdHJpbmdcbiAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0aGF0IGlzIHRvIGJlIHJlcGVhdGVkXG4gKi9cbmZ1bmN0aW9uIHJlcGVhdChjb3VudDogbnVtYmVyLCBzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvdW50ID0gTWF0aC5mbG9vcihjb3VudCk7XG4gIGxldCBycHQgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcnB0ICs9IHN0cjtcbiAgfVxuICByZXR1cm4gcnB0O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBEb21SZW5kZXJlclJvd0ZhY3RvcnksIFJvd0NzcyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvZG9tL0RvbVJlbmRlcmVyUm93RmFjdG9yeSc7XG5pbXBvcnQgeyBXaWR0aENhY2hlIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9kb20vV2lkdGhDYWNoZSc7XG5pbXBvcnQgeyBJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvQ29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9SZW5kZXJlclV0aWxzJztcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvU2VsZWN0aW9uUmVuZGVyTW9kZWwnO1xuaW1wb3J0IHsgSVJlbmRlckRpbWVuc2lvbnMsIElSZW5kZXJlciwgSVJlcXVlc3RSZWRyYXdFdmVudCwgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSwgSUNvcmVCcm93c2VyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUxpbmtpZmllcjIsIElMaW5raWZpZXJFdmVudCwgSVRlcm1pbmFsLCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjb2xvciB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElJbnN0YW50aWF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuXG5jb25zdCBURVJNSU5BTF9DTEFTU19QUkVGSVggPSAneHRlcm0tZG9tLXJlbmRlcmVyLW93bmVyLSc7XG5jb25zdCBST1dfQ09OVEFJTkVSX0NMQVNTID0gJ3h0ZXJtLXJvd3MnO1xuY29uc3QgRkdfQ0xBU1NfUFJFRklYID0gJ3h0ZXJtLWZnLSc7XG5jb25zdCBCR19DTEFTU19QUkVGSVggPSAneHRlcm0tYmctJztcbmNvbnN0IEZPQ1VTX0NMQVNTID0gJ3h0ZXJtLWZvY3VzJztcbmNvbnN0IFNFTEVDVElPTl9DTEFTUyA9ICd4dGVybS1zZWxlY3Rpb24nO1xuXG5sZXQgbmV4dFRlcm1pbmFsSWQgPSAxO1xuXG4vKipcbiAqIEEgZmFsbGJhY2sgcmVuZGVyZXIgZm9yIHdoZW4gY2FudmFzIGlzIHNsb3cuIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlXG4gKiBwYXJ0aWN1bGFybHkgZmFzdCBvciBmZWF0dXJlIGNvbXBsZXRlLCBtb3JlIGp1c3Qgc3RhYmxlIGFuZCB1c2FibGUgZm9yIHdoZW5cbiAqIGNhbnZhcyBpcyBub3QgYW4gb3B0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRG9tUmVuZGVyZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSVJlbmRlcmVyIHtcbiAgcHJpdmF0ZSBfcm93RmFjdG9yeTogRG9tUmVuZGVyZXJSb3dGYWN0b3J5O1xuICBwcml2YXRlIF90ZXJtaW5hbENsYXNzOiBudW1iZXIgPSBuZXh0VGVybWluYWxJZCsrO1xuXG4gIHByaXZhdGUgX3RoZW1lU3R5bGVFbGVtZW50ITogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHJpdmF0ZSBfZGltZW5zaW9uc1N0eWxlRWxlbWVudCE6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gIHByaXZhdGUgX3Jvd0NvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3Jvd0VsZW1lbnRzOiBIVE1MRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgX3NlbGVjdGlvbkNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3dpZHRoQ2FjaGU6IFdpZHRoQ2FjaGU7XG4gIHByaXZhdGUgX3NlbGVjdGlvblJlbmRlck1vZGVsOiBJU2VsZWN0aW9uUmVuZGVyTW9kZWwgPSBjcmVhdGVTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xuXG4gIHB1YmxpYyBkaW1lbnNpb25zOiBJUmVuZGVyRGltZW5zaW9ucztcblxuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0UmVkcmF3ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElSZXF1ZXN0UmVkcmF3RXZlbnQ+KCkpLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3Rlcm1pbmFsOiBJVGVybWluYWwsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaGVscGVyQ29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9saW5raWZpZXIyOiBJTGlua2lmaWVyMixcbiAgICBASUluc3RhbnRpYXRpb25TZXJ2aWNlIGluc3RhbnRpYXRpb25TZXJ2aWNlOiBJSW5zdGFudGlhdGlvblNlcnZpY2UsXG4gICAgQElDaGFyU2l6ZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlLFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJVGhlbWVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX3RoZW1lU2VydmljZTogSVRoZW1lU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFJPV19DT05UQUlORVJfQ0xBU1MpO1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gJ25vcm1hbCc7XG4gICAgdGhpcy5fcm93Q29udGFpbmVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuX3JlZnJlc2hSb3dFbGVtZW50cyh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyk7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoU0VMRUNUSU9OX0NMQVNTKTtcbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG5cbiAgICB0aGlzLmRpbWVuc2lvbnMgPSBjcmVhdGVSZW5kZXJEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25PcHRpb25DaGFuZ2UoKCkgPT4gdGhpcy5faGFuZGxlT3B0aW9uc0NoYW5nZWQoKSkpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl90aGVtZVNlcnZpY2Uub25DaGFuZ2VDb2xvcnMoZSA9PiB0aGlzLl9pbmplY3RDc3MoZSkpKTtcbiAgICB0aGlzLl9pbmplY3RDc3ModGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycyk7XG5cbiAgICB0aGlzLl9yb3dGYWN0b3J5ID0gaW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoRG9tUmVuZGVyZXJSb3dGYWN0b3J5LCBkb2N1bWVudCk7XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoVEVSTUlOQUxfQ0xBU1NfUFJFRklYICsgdGhpcy5fdGVybWluYWxDbGFzcyk7XG4gICAgdGhpcy5fc2NyZWVuRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9yb3dDb250YWluZXIpO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fc2VsZWN0aW9uQ29udGFpbmVyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fbGlua2lmaWVyMi5vblNob3dMaW5rVW5kZXJsaW5lKGUgPT4gdGhpcy5faGFuZGxlTGlua0hvdmVyKGUpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9saW5raWZpZXIyLm9uSGlkZUxpbmtVbmRlcmxpbmUoZSA9PiB0aGlzLl9oYW5kbGVMaW5rTGVhdmUoZSkpKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShURVJNSU5BTF9DTEFTU19QUkVGSVggKyB0aGlzLl90ZXJtaW5hbENsYXNzKTtcblxuICAgICAgLy8gT3V0c2lkZSBpbmZsdWVuY2VzIHN1Y2ggYXMgUmVhY3QgdW5tb3VudHMgbWF5IG1hbmlwdWxhdGUgdGhlIERPTSBiZWZvcmUgb3VyIGRpc3Bvc2FsLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzI5NjBcbiAgICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lci5yZW1vdmUoKTtcbiAgICAgIHRoaXMuX3dpZHRoQ2FjaGUuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fdGhlbWVTdHlsZUVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9kaW1lbnNpb25zU3R5bGVFbGVtZW50LnJlbW92ZSgpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuX3dpZHRoQ2FjaGUgPSBuZXcgV2lkdGhDYWNoZSh0aGlzLl9kb2N1bWVudCwgdGhpcy5faGVscGVyQ29udGFpbmVyKTtcbiAgICB0aGlzLl93aWR0aENhY2hlLnNldEZvbnQoXG4gICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHksXG4gICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRTaXplLFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0LFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250V2VpZ2h0Qm9sZFxuICAgICk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZURpbWVuc2lvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgZHByID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmRwcjtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggPSB0aGlzLl9jaGFyU2l6ZVNlcnZpY2Uud2lkdGggKiBkcHI7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCA9IE1hdGguY2VpbCh0aGlzLl9jaGFyU2l6ZVNlcnZpY2UuaGVpZ2h0ICogZHByKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNlbGwud2lkdGggPSB0aGlzLmRpbWVuc2lvbnMuZGV2aWNlLmNoYXIud2lkdGggKyBNYXRoLnJvdW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGV0dGVyU3BhY2luZyk7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLmhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmhlaWdodCAqIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubGluZUhlaWdodCk7XG4gICAgdGhpcy5kaW1lbnNpb25zLmRldmljZS5jaGFyLmxlZnQgPSAwO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2hhci50b3AgPSAwO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmRldmljZS5jZWxsLndpZHRoICogdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgIHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2VsbC5oZWlnaHQgKiB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLndpZHRoIC8gZHByKTtcbiAgICB0aGlzLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuZGltZW5zaW9ucy5kZXZpY2UuY2FudmFzLmhlaWdodCAvIGRwcik7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoID0gdGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodCAvIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLl9yb3dFbGVtZW50cykge1xuICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRofXB4YDtcbiAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gICAgICBlbGVtZW50LnN0eWxlLmxpbmVIZWlnaHQgPSBgJHt0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICAgIC8vIE1ha2Ugc3VyZSByb3dzIGRvbid0IG92ZXJmbG93IG9udG8gZm9sbG93aW5nIHJvd1xuICAgICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fZGltZW5zaW9uc1N0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlcyA9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSBzcGFuIHtgICtcbiAgICAgIGAgZGlzcGxheTogaW5saW5lLWJsb2NrO2AgKyAgIC8vIFRPRE86IGZpbmQgd29ya2Fyb3VuZCBmb3IgaW5saW5lLWJsb2NrIChjcmVhdGVzIH4yMCUgcmVuZGVyIHBlbmFsdHkpXG4gICAgICBgIGhlaWdodDogMTAwJTtgICtcbiAgICAgIGAgdmVydGljYWwtYWxpZ246IHRvcDtgICtcbiAgICAgIGB9YDtcblxuICAgIHRoaXMuX2RpbWVuc2lvbnNTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSBzdHlsZXM7XG5cbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIuc3R5bGUuaGVpZ2h0ID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnN0eWxlLmhlaWdodDtcbiAgICB0aGlzLl9zY3JlZW5FbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGh9cHhgO1xuICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5kaW1lbnNpb25zLmNzcy5jYW52YXMuaGVpZ2h0fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgX2luamVjdENzcyhjb2xvcnM6IFJlYWRvbmx5Q29sb3JTZXQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RoZW1lU3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl90aGVtZVN0eWxlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RoZW1lU3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvLyBCYXNlIENTU1xuICAgIGxldCBzdHlsZXMgPVxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30ge2AgK1xuICAgICAgYCBjb2xvcjogJHtjb2xvcnMuZm9yZWdyb3VuZC5jc3N9O2AgK1xuICAgICAgYCBmb250LWZhbWlseTogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRGYW1pbHl9O2AgK1xuICAgICAgYCBmb250LXNpemU6ICR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZX1weDtgICtcbiAgICAgIGAgZm9udC1rZXJuaW5nOiBub25lO2AgK1xuICAgICAgYCB3aGl0ZS1zcGFjZTogcHJlYCArXG4gICAgICBgfWA7XG4gICAgc3R5bGVzICs9XG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAueHRlcm0tZGltIHtgICtcbiAgICAgIGAgY29sb3I6ICR7Y29sb3IubXVsdGlwbHlPcGFjaXR5KGNvbG9ycy5mb3JlZ3JvdW5kLCAwLjUpLmNzc307YCArXG4gICAgICBgfWA7XG4gICAgLy8gVGV4dCBzdHlsZXNcbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IHNwYW46bm90KC4ke1Jvd0Nzcy5CT0xEX0NMQVNTfSkge2AgK1xuICAgICAgYCBmb250LXdlaWdodDogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHR9O2AgK1xuICAgICAgYH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IHNwYW4uJHtSb3dDc3MuQk9MRF9DTEFTU30ge2AgK1xuICAgICAgYCBmb250LXdlaWdodDogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmZvbnRXZWlnaHRCb2xkfTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSBzcGFuLiR7Um93Q3NzLklUQUxJQ19DTEFTU30ge2AgK1xuICAgICAgYCBmb250LXN0eWxlOiBpdGFsaWM7YCArXG4gICAgICBgfWA7XG4gICAgLy8gQmxpbmsgYW5pbWF0aW9uXG4gICAgY29uc3QgYmxpbmtBbmltYXRpb25VbmRlcmxpbmVJZCA9IGBibGlua191bmRlcmxpbmVfJHt0aGlzLl90ZXJtaW5hbENsYXNzfWA7XG4gICAgY29uc3QgYmxpbmtBbmltYXRpb25CYXJJZCA9IGBibGlua19iYXJfJHt0aGlzLl90ZXJtaW5hbENsYXNzfWA7XG4gICAgY29uc3QgYmxpbmtBbmltYXRpb25CbG9ja0lkID0gYGJsaW5rX2Jsb2NrXyR7dGhpcy5fdGVybWluYWxDbGFzc31gO1xuICAgIHN0eWxlcyArPVxuICAgICAgYEBrZXlmcmFtZXMgJHtibGlua0FuaW1hdGlvblVuZGVybGluZUlkfSB7YCArXG4gICAgICBgIDUwJSB7YCArXG4gICAgICBgICBib3JkZXItYm90dG9tLXN0eWxlOiBoaWRkZW47YCArXG4gICAgICBgIH1gICtcbiAgICAgIGB9YDtcbiAgICBzdHlsZXMgKz1cbiAgICAgIGBAa2V5ZnJhbWVzICR7YmxpbmtBbmltYXRpb25CYXJJZH0ge2AgK1xuICAgICAgYCA1MCUge2AgK1xuICAgICAgYCAgYm94LXNoYWRvdzogbm9uZTtgICtcbiAgICAgIGAgfWAgK1xuICAgICAgYH1gO1xuICAgIHN0eWxlcyArPVxuICAgICAgYEBrZXlmcmFtZXMgJHtibGlua0FuaW1hdGlvbkJsb2NrSWR9IHtgICtcbiAgICAgIGAgMCUge2AgK1xuICAgICAgYCAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgICBjb2xvcjogJHtjb2xvcnMuY3Vyc29yQWNjZW50LmNzc307YCArXG4gICAgICBgIH1gICtcbiAgICAgIGAgNTAlIHtgICtcbiAgICAgIGAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7YCArXG4gICAgICBgICBjb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIH1gICtcbiAgICAgIGB9YDtcbiAgICAvLyBDdXJzb3JcbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1JPV19DT05UQUlORVJfQ0xBU1N9LiR7Rk9DVVNfQ0xBU1N9IC4ke1Jvd0Nzcy5DVVJTT1JfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9CTElOS19DTEFTU30uJHtSb3dDc3MuQ1VSU09SX1NUWUxFX1VOREVSTElORV9DTEFTU30ge2AgK1xuICAgICAgYCBhbmltYXRpb246ICR7YmxpbmtBbmltYXRpb25VbmRlcmxpbmVJZH0gMXMgc3RlcC1lbmQgaW5maW5pdGU7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7Uk9XX0NPTlRBSU5FUl9DTEFTU30uJHtGT0NVU19DTEFTU30gLiR7Um93Q3NzLkNVUlNPUl9DTEFTU30uJHtSb3dDc3MuQ1VSU09SX0JMSU5LX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkFSX0NMQVNTfSB7YCArXG4gICAgICBgIGFuaW1hdGlvbjogJHtibGlua0FuaW1hdGlvbkJhcklkfSAxcyBzdGVwLWVuZCBpbmZpbml0ZTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfS4ke0ZPQ1VTX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfQkxJTktfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9TVFlMRV9CTE9DS19DTEFTU30ge2AgK1xuICAgICAgYCBhbmltYXRpb246ICR7YmxpbmtBbmltYXRpb25CbG9ja0lkfSAxcyBzdGVwLWVuZCBpbmZpbml0ZTtgICtcbiAgICAgIGB9YCArXG4gICAgICAvLyAhaW1wb3J0YW50IGhlbHBzIGZpeCBhbiBpc3N1ZSB3aGVyZSB0aGUgY3Vyc29yIHdpbGwgbm90IHJlbmRlciBvbiB0b3Agb2YgdGhlIHNlbGVjdGlvbixcbiAgICAgIC8vIGhvd2V2ZXIgaXQncyB2ZXJ5IGhhcmQgdG8gZml4IHRoaXMgaXNzdWUgYW5kIHJldGFpbiB0aGUgYmxpbmsgYW5pbWF0aW9uIHdpdGhvdXQgdGhlIHVzZSBvZlxuICAgICAgLy8gIWltcG9ydGFudC4gU28gdGhpcyBlZGdlIGNhc2UgZmFpbHMgd2hlbiBjdXJzb3IgYmxpbmsgaXMgb24uXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1N9IHtgICtcbiAgICAgIGAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIGNvbG9yOiAke2NvbG9ycy5jdXJzb3JBY2NlbnQuY3NzfTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1N9Om5vdCguJHtSb3dDc3MuQ1VSU09SX0JMSU5LX0NMQVNTfSkge2AgK1xuICAgICAgYCBiYWNrZ3JvdW5kLWNvbG9yOiAke2NvbG9ycy5jdXJzb3IuY3NzfSAhaW1wb3J0YW50O2AgK1xuICAgICAgYCBjb2xvcjogJHtjb2xvcnMuY3Vyc29yQWNjZW50LmNzc30gIWltcG9ydGFudDtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfT1VUTElORV9DTEFTU30ge2AgK1xuICAgICAgYCBvdXRsaW5lOiAxcHggc29saWQgJHtjb2xvcnMuY3Vyc29yLmNzc307YCArXG4gICAgICBgIG91dGxpbmUtb2Zmc2V0OiAtMXB4O2AgK1xuICAgICAgYH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1JPV19DT05UQUlORVJfQ0xBU1N9IC4ke1Jvd0Nzcy5DVVJTT1JfQ0xBU1N9LiR7Um93Q3NzLkNVUlNPUl9TVFlMRV9CQVJfQ0xBU1N9IHtgICtcbiAgICAgIGAgYm94LXNoYWRvdzogJHt0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvcldpZHRofXB4IDAgMCAke2NvbG9ycy5jdXJzb3IuY3NzfSBpbnNldDtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtST1dfQ09OVEFJTkVSX0NMQVNTfSAuJHtSb3dDc3MuQ1VSU09SX0NMQVNTfS4ke1Jvd0Nzcy5DVVJTT1JfU1RZTEVfVU5ERVJMSU5FX0NMQVNTfSB7YCArXG4gICAgICBgIGJvcmRlci1ib3R0b206IDFweCAke2NvbG9ycy5jdXJzb3IuY3NzfTtgICtcbiAgICAgIGAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7YCArXG4gICAgICBgIGhlaWdodDogY2FsYygxMDAlIC0gMXB4KTtgICtcbiAgICAgIGB9YDtcbiAgICAvLyBTZWxlY3Rpb25cbiAgICBzdHlsZXMgKz1cbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke1NFTEVDVElPTl9DTEFTU30ge2AgK1xuICAgICAgYCBwb3NpdGlvbjogYWJzb2x1dGU7YCArXG4gICAgICBgIHRvcDogMDtgICtcbiAgICAgIGAgbGVmdDogMDtgICtcbiAgICAgIGAgei1pbmRleDogMTtgICtcbiAgICAgIGAgcG9pbnRlci1ldmVudHM6IG5vbmU7YCArXG4gICAgICBgfWAgK1xuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0uZm9jdXMgLiR7U0VMRUNUSU9OX0NMQVNTfSBkaXYge2AgK1xuICAgICAgYCBwb3NpdGlvbjogYWJzb2x1dGU7YCArXG4gICAgICBgIGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRPcGFxdWUuY3NzfTtgICtcbiAgICAgIGB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtTRUxFQ1RJT05fQ0xBU1N9IGRpdiB7YCArXG4gICAgICBgIHBvc2l0aW9uOiBhYnNvbHV0ZTtgICtcbiAgICAgIGAgYmFja2dyb3VuZC1jb2xvcjogJHtjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kT3BhcXVlLmNzc307YCArXG4gICAgICBgfWA7XG4gICAgLy8gQ29sb3JzXG4gICAgZm9yIChjb25zdCBbaSwgY10gb2YgY29sb3JzLmFuc2kuZW50cmllcygpKSB7XG4gICAgICBzdHlsZXMgKz1cbiAgICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7RkdfQ0xBU1NfUFJFRklYfSR7aX0geyBjb2xvcjogJHtjLmNzc307IH1gICtcbiAgICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7RkdfQ0xBU1NfUFJFRklYfSR7aX0uJHtSb3dDc3MuRElNX0NMQVNTfSB7IGNvbG9yOiAke2NvbG9yLm11bHRpcGx5T3BhY2l0eShjLCAwLjUpLmNzc307IH1gICtcbiAgICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7QkdfQ0xBU1NfUFJFRklYfSR7aX0geyBiYWNrZ3JvdW5kLWNvbG9yOiAke2MuY3NzfTsgfWA7XG4gICAgfVxuICAgIHN0eWxlcyArPVxuICAgICAgYCR7dGhpcy5fdGVybWluYWxTZWxlY3Rvcn0gLiR7RkdfQ0xBU1NfUFJFRklYfSR7SU5WRVJURURfREVGQVVMVF9DT0xPUn0geyBjb2xvcjogJHtjb2xvci5vcGFxdWUoY29sb3JzLmJhY2tncm91bmQpLmNzc307IH1gICtcbiAgICAgIGAke3RoaXMuX3Rlcm1pbmFsU2VsZWN0b3J9IC4ke0ZHX0NMQVNTX1BSRUZJWH0ke0lOVkVSVEVEX0RFRkFVTFRfQ09MT1J9LiR7Um93Q3NzLkRJTV9DTEFTU30geyBjb2xvcjogJHtjb2xvci5tdWx0aXBseU9wYWNpdHkoY29sb3Iub3BhcXVlKGNvbG9ycy5iYWNrZ3JvdW5kKSwgMC41KS5jc3N9OyB9YCArXG4gICAgICBgJHt0aGlzLl90ZXJtaW5hbFNlbGVjdG9yfSAuJHtCR19DTEFTU19QUkVGSVh9JHtJTlZFUlRFRF9ERUZBVUxUX0NPTE9SfSB7IGJhY2tncm91bmQtY29sb3I6ICR7Y29sb3JzLmZvcmVncm91bmQuY3NzfTsgfWA7XG5cbiAgICB0aGlzLl90aGVtZVN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZhdWx0IGxldHRlciBzcGFjaW5nXG4gICAqIER1ZSB0byByb3VuZGluZyBpc3N1ZXMgaW4gZGltZW5zaW9ucyBkcHIgY2FsYyBnbHlwaCBtaWdodCByZW5kZXJcbiAgICogc2xpZ2h0bHkgdG9vIHdpZGUgb3IgdG9vIG5hcnJvdy4gVGhlIG1ldGhvZCBjb3JyZWN0cyB0aGUgc3RhY2tpbmcgb2Zmc2V0c1xuICAgKiBieSBhcHBseWluZyBhIGRlZmF1bHQgbGV0dGVyLXNwYWNpbmcgZm9yIGFsbCBjaGFycy5cbiAgICogVGhlIHZhbHVlIGdldHMgcGFzc2VkIHRvIHRoZSByb3cgZmFjdG9yeSB0byBhdm9pZCBzZXR0aW5nIHRoaXMgdmFsdWUgYWdhaW5cbiAgICogKHJlbmRlciBzcGVlZHVwIGlzIHJvdWdobHkgMTAlKS5cbiAgICovXG4gIHByaXZhdGUgX3NldERlZmF1bHRTcGFjaW5nKCk6IHZvaWQge1xuICAgIC8vIG1lYXN1cmUgc2FtZSBjaGFyIGFzIGluIENoYXJTaXplU2VydmljZSB0byBnZXQgdGhlIGJhc2UgZGV2aWF0aW9uXG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCAtIHRoaXMuX3dpZHRoQ2FjaGUuZ2V0KCdXJywgZmFsc2UsIGZhbHNlKTtcbiAgICB0aGlzLl9yb3dDb250YWluZXIuc3R5bGUubGV0dGVyU3BhY2luZyA9IGAke3NwYWNpbmd9cHhgO1xuICAgIHRoaXMuX3Jvd0ZhY3RvcnkuZGVmYXVsdFNwYWNpbmcgPSBzcGFjaW5nO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIHRoaXMuX3dpZHRoQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9zZXREZWZhdWx0U3BhY2luZygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVmcmVzaFJvd0VsZW1lbnRzKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gQWRkIG1pc3NpbmcgZWxlbWVudHNcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fcm93RWxlbWVudHMubGVuZ3RoOyBpIDw9IHJvd3M7IGkrKykge1xuICAgICAgY29uc3Qgcm93ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgIHRoaXMuX3Jvd0VsZW1lbnRzLnB1c2gocm93KTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGV4Y2VzcyBlbGVtZW50c1xuICAgIHdoaWxlICh0aGlzLl9yb3dFbGVtZW50cy5sZW5ndGggPiByb3dzKSB7XG4gICAgICB0aGlzLl9yb3dDb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5fcm93RWxlbWVudHMucG9wKCkhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcmVmcmVzaFJvd0VsZW1lbnRzKGNvbHMsIHJvd3MpO1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZWQodGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuc2VsZWN0aW9uU3RhcnQsIHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnNlbGVjdGlvbkVuZCwgdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwuY29sdW1uU2VsZWN0TW9kZSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZURpbWVuc2lvbnMoKTtcbiAgICB0aGlzLl93aWR0aENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc2V0RGVmYXVsdFNwYWNpbmcoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jvd0NvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKEZPQ1VTX0NMQVNTKTtcbiAgICB0aGlzLnJlbmRlclJvd3MoMCwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fcm93Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoRk9DVVNfQ0xBU1MpO1xuICAgIHRoaXMucmVuZGVyUm93cyh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55KTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAvLyBSZW1vdmUgYWxsIHNlbGVjdGlvbnNcbiAgICB0aGlzLl9zZWxlY3Rpb25Db250YWluZXIucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgdGhpcy5fcm93RmFjdG9yeS5oYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0LCBlbmQsIGNvbHVtblNlbGVjdE1vZGUpO1xuICAgIHRoaXMucmVuZGVyUm93cygwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcblxuICAgIC8vIFNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnVwZGF0ZSh0aGlzLl90ZXJtaW5hbCwgc3RhcnQsIGVuZCwgY29sdW1uU2VsZWN0TW9kZSk7XG5cbiAgICAvLyBUcmFuc2xhdGUgZnJvbSBidWZmZXIgcG9zaXRpb24gdG8gdmlld3BvcnQgcG9zaXRpb25cbiAgICBjb25zdCB2aWV3cG9ydFN0YXJ0Um93ID0gdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwudmlld3BvcnRTdGFydFJvdztcbiAgICBjb25zdCB2aWV3cG9ydEVuZFJvdyA9IHRoaXMuX3NlbGVjdGlvblJlbmRlck1vZGVsLnZpZXdwb3J0RW5kUm93O1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgPSB0aGlzLl9zZWxlY3Rpb25SZW5kZXJNb2RlbC52aWV3cG9ydENhcHBlZFN0YXJ0Um93O1xuICAgIGNvbnN0IHZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gdGhpcy5fc2VsZWN0aW9uUmVuZGVyTW9kZWwudmlld3BvcnRDYXBwZWRFbmRSb3c7XG5cbiAgICAvLyBObyBuZWVkIHRvIGRyYXcgdGhlIHNlbGVjdGlvblxuICAgIGlmICh2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyB8fCB2aWV3cG9ydENhcHBlZEVuZFJvdyA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIHNlbGVjdGlvbnNcbiAgICBjb25zdCBkb2N1bWVudEZyYWdtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgaWYgKGNvbHVtblNlbGVjdE1vZGUpIHtcbiAgICAgIGNvbnN0IGlzWEZsaXBwZWQgPSBzdGFydFswXSA+IGVuZFswXTtcbiAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQoXG4gICAgICAgIHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQodmlld3BvcnRDYXBwZWRTdGFydFJvdywgaXNYRmxpcHBlZCA/IGVuZFswXSA6IHN0YXJ0WzBdLCBpc1hGbGlwcGVkID8gc3RhcnRbMF0gOiBlbmRbMF0sIHZpZXdwb3J0Q2FwcGVkRW5kUm93IC0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyArIDEpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEcmF3IGZpcnN0IHJvd1xuICAgICAgY29uc3Qgc3RhcnRDb2wgPSB2aWV3cG9ydFN0YXJ0Um93ID09PSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID8gc3RhcnRbMF0gOiAwO1xuICAgICAgY29uc3QgZW5kQ29sID0gdmlld3BvcnRDYXBwZWRTdGFydFJvdyA9PT0gdmlld3BvcnRFbmRSb3cgPyBlbmRbMF0gOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICBkb2N1bWVudEZyYWdtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQodmlld3BvcnRDYXBwZWRTdGFydFJvdywgc3RhcnRDb2wsIGVuZENvbCkpO1xuICAgICAgLy8gRHJhdyBtaWRkbGUgcm93c1xuICAgICAgY29uc3QgbWlkZGxlUm93c0NvdW50ID0gdmlld3BvcnRDYXBwZWRFbmRSb3cgLSB2aWV3cG9ydENhcHBlZFN0YXJ0Um93IC0gMTtcbiAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlU2VsZWN0aW9uRWxlbWVudCh2aWV3cG9ydENhcHBlZFN0YXJ0Um93ICsgMSwgMCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCBtaWRkbGVSb3dzQ291bnQpKTtcbiAgICAgIC8vIERyYXcgZmluYWwgcm93XG4gICAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyAhPT0gdmlld3BvcnRDYXBwZWRFbmRSb3cpIHtcbiAgICAgICAgLy8gT25seSBkcmF3IHZpZXdwb3J0RW5kUm93IGlmIGl0J3Mgbm90IHRoZSBzYW1lIGFzIHZpZXdwb3J0dGFydFJvd1xuICAgICAgICBjb25zdCBlbmRDb2wgPSB2aWV3cG9ydEVuZFJvdyA9PT0gdmlld3BvcnRDYXBwZWRFbmRSb3cgPyBlbmRbMF0gOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlU2VsZWN0aW9uRWxlbWVudCh2aWV3cG9ydENhcHBlZEVuZFJvdywgMCwgZW5kQ29sKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudEZyYWdtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc2VsZWN0aW9uIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi5cbiAgICogQHBhcmFtIHJvdyBUaGUgcm93IG9mIHRoZSBzZWxlY3Rpb24uXG4gICAqIEBwYXJhbSBjb2xTdGFydCBUaGUgc3RhcnQgY29sdW1uLlxuICAgKiBAcGFyYW0gY29sRW5kIFRoZSBlbmQgY29sdW1ucy5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZVNlbGVjdGlvbkVsZW1lbnQocm93OiBudW1iZXIsIGNvbFN0YXJ0OiBudW1iZXIsIGNvbEVuZDogbnVtYmVyLCByb3dDb3VudDogbnVtYmVyID0gMSk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgbGVmdCA9IGNvbFN0YXJ0ICogdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoO1xuICAgIGxldCB3aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCAqIChjb2xFbmQgLSBjb2xTdGFydCk7XG4gICAgaWYgKGxlZnQgKyB3aWR0aCA+IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoKSB7XG4gICAgICB3aWR0aCA9IHRoaXMuZGltZW5zaW9ucy5jc3MuY2FudmFzLndpZHRoIC0gbGVmdDtcbiAgICB9XG5cbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3Jvd0NvdW50ICogdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodH1weGA7XG4gICAgZWxlbWVudC5zdHlsZS50b3AgPSBgJHtyb3cgKiB0aGlzLmRpbWVuc2lvbnMuY3NzLmNlbGwuaGVpZ2h0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUN1cnNvck1vdmUoKTogdm9pZCB7XG4gICAgLy8gTm8tb3AsIHRoZSBjdXJzb3IgaXMgZHJhd24gd2hlbiByb3dzIGFyZSBkcmF3blxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlT3B0aW9uc0NoYW5nZWQoKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgYSByZWZyZXNoXG4gICAgdGhpcy5fdXBkYXRlRGltZW5zaW9ucygpO1xuICAgIC8vIFJlZnJlc2ggQ1NTXG4gICAgdGhpcy5faW5qZWN0Q3NzKHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMpO1xuICAgIC8vIHVwZGF0ZSBzcGFjaW5nIGNhY2hlXG4gICAgdGhpcy5fd2lkdGhDYWNoZS5zZXRGb250KFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5LFxuICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZSxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodCxcbiAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udFdlaWdodEJvbGRcbiAgICApO1xuICAgIHRoaXMuX3NldERlZmF1bHRTcGFjaW5nKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBlIG9mIHRoaXMuX3Jvd0VsZW1lbnRzKSB7XG4gICAgICAvKipcbiAgICAgICAqIE5PVEU6IFRoaXMgdXNlZCB0byBiZSBgZS5pbm5lclRleHQgPSAnJztgIGJ1dCB0aGF0IGRvZXNuJ3Qgd29yayB3aGVuIHVzaW5nIGBqc2RvbWAgYW5kXG4gICAgICAgKiBgQHRlc3RpbmctbGlicmFyeS9yZWFjdGBcbiAgICAgICAqXG4gICAgICAgKiByZWZlcmVuY2VzOlxuICAgICAgICogLSBodHRwczovL2dpdGh1Yi5jb20vdGVzdGluZy1saWJyYXJ5L3JlYWN0LXRlc3RpbmctbGlicmFyeS9pc3N1ZXMvMTE0NlxuICAgICAgICogLSBodHRwczovL2dpdGh1Yi5jb20vanNkb20vanNkb20vaXNzdWVzLzEyNDVcbiAgICAgICAqL1xuICAgICAgZS5yZXBsYWNlQ2hpbGRyZW4oKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVuZGVyUm93cyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IGN1cnNvckFic29sdXRlWSA9IGJ1ZmZlci55YmFzZSArIGJ1ZmZlci55O1xuICAgIGNvbnN0IGN1cnNvclggPSBNYXRoLm1pbihidWZmZXIueCwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzIC0gMSk7XG4gICAgY29uc3QgY3Vyc29yQmxpbmsgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvckJsaW5rO1xuICAgIGNvbnN0IGN1cnNvclN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JTdHlsZTtcbiAgICBjb25zdCBjdXJzb3JJbmFjdGl2ZVN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlO1xuXG4gICAgZm9yIChsZXQgeSA9IHN0YXJ0OyB5IDw9IGVuZDsgeSsrKSB7XG4gICAgICBjb25zdCByb3cgPSB5ICsgYnVmZmVyLnlkaXNwO1xuICAgICAgY29uc3Qgcm93RWxlbWVudCA9IHRoaXMuX3Jvd0VsZW1lbnRzW3ldO1xuICAgICAgY29uc3QgbGluZURhdGEgPSBidWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgICBpZiAoIXJvd0VsZW1lbnQgfHwgIWxpbmVEYXRhKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcm93RWxlbWVudC5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAgIC4uLnRoaXMuX3Jvd0ZhY3RvcnkuY3JlYXRlUm93KFxuICAgICAgICAgIGxpbmVEYXRhLFxuICAgICAgICAgIHJvdyxcbiAgICAgICAgICByb3cgPT09IGN1cnNvckFic29sdXRlWSxcbiAgICAgICAgICBjdXJzb3JTdHlsZSxcbiAgICAgICAgICBjdXJzb3JJbmFjdGl2ZVN0eWxlLFxuICAgICAgICAgIGN1cnNvclgsXG4gICAgICAgICAgY3Vyc29yQmxpbmssXG4gICAgICAgICAgdGhpcy5kaW1lbnNpb25zLmNzcy5jZWxsLndpZHRoLFxuICAgICAgICAgIHRoaXMuX3dpZHRoQ2FjaGUsXG4gICAgICAgICAgLTEsXG4gICAgICAgICAgLTFcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBfdGVybWluYWxTZWxlY3RvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBgLiR7VEVSTUlOQUxfQ0xBU1NfUFJFRklYfSR7dGhpcy5fdGVybWluYWxDbGFzc31gO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlTGlua0hvdmVyKGU6IElMaW5raWZpZXJFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX3NldENlbGxVbmRlcmxpbmUoZS54MSwgZS54MiwgZS55MSwgZS55MiwgZS5jb2xzLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUxpbmtMZWF2ZShlOiBJTGlua2lmaWVyRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXRDZWxsVW5kZXJsaW5lKGUueDEsIGUueDIsIGUueTEsIGUueTIsIGUuY29scywgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0Q2VsbFVuZGVybGluZSh4OiBudW1iZXIsIHgyOiBudW1iZXIsIHk6IG51bWJlciwgeTI6IG51bWJlciwgY29sczogbnVtYmVyLCBlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgLyoqXG4gICAgICogTk9URTogVGhlIGxpbmtpZmllciBtYXkgc2VuZCBvdXQgb2Ygdmlld3BvcnQgeS12YWx1ZXMgaWY6XG4gICAgICogLSBuZWdhdGl2ZSB5LXZhbHVlOiB0aGUgbGluayBzdGFydGVkIGF0IGEgaGlnaGVyIGxpbmVcbiAgICAgKiAtIHktdmFsdWUgPj0gbWF4WTogdGhlIGxpbmsgZW5kcyBhdCBhIGxpbmUgYmVsb3cgdmlld3BvcnRcbiAgICAgKlxuICAgICAqIEZvciBuZWdhdGl2ZSB5LXZhbHVlcyB3ZSBjYW4gc2ltcGx5IGFkanVzdCB4ID0gMCxcbiAgICAgKiBhcyBoaWdoZXIgdXAgbGluayBzdGFydCBtZWFucywgdGhhdCBldmVyeXRoaW5nIGZyb21cbiAgICAgKiAoMCwwKSBpcyBhIGxpbmsgdW5kZXIgdG9wLWRvd24tbGVmdC1yaWdodCBjaGFyIHByb2dyZXNzaW9uXG4gICAgICpcbiAgICAgKiBBZGRpdGlvbmFsbHkgdGhlcmUgbWlnaHQgYmUgYSBzbWFsbCBjaGFuY2Ugb2Ygb3V0LW9mLXN5bmMgeHx5LXZhbHVlc1xuICAgICAqIGZyb20gYSByYWNlIGNvbmRpdGlvbiBvZiByZW5kZXIgdXBkYXRlcyB2cy4gbGluayBldmVudCBoYW5kbGVyIGV4ZWN1dGlvbjpcbiAgICAgKiAtIChzeW5jKSByZXNpemU6IGNoYW5jZXMgdGVybWluYWwgYnVmZmVyIGluIHN5bmMsIHNjaGVkdWxlcyByZW5kZXIgdXBkYXRlIGFzeW5jXG4gICAgICogLSAoYXN5bmMpIGxpbmsgaGFuZGxlciByYWNlIGNvbmRpdGlvbjogbmV3IGJ1ZmZlciBtZXRyaWNzLCBidXQgc3RpbGwgb24gb2xkIHJlbmRlciBzdGF0ZVxuICAgICAqIC0gKGFzeW5jKSByZW5kZXIgdXBkYXRlOiBicmluZ3MgdGVybSBtZXRyaWNzIGFuZCByZW5kZXIgc3RhdGUgYmFjayBpbiBzeW5jXG4gICAgICovXG4gICAgLy8gY2xpcCBjb29yZHMgaW50byB2aWV3cG9ydFxuICAgIGlmICh5IDwgMCkgeCA9IDA7XG4gICAgaWYgKHkyIDwgMCkgeDIgPSAwO1xuICAgIGNvbnN0IG1heFkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgIHkgPSBNYXRoLm1heChNYXRoLm1pbih5LCBtYXhZKSwgMCk7XG4gICAgeTIgPSBNYXRoLm1heChNYXRoLm1pbih5MiwgbWF4WSksIDApO1xuXG4gICAgY29scyA9IE1hdGgubWluKGNvbHMsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyk7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgY29uc3QgY3Vyc29yQWJzb2x1dGVZID0gYnVmZmVyLnliYXNlICsgYnVmZmVyLnk7XG4gICAgY29uc3QgY3Vyc29yWCA9IE1hdGgubWluKGJ1ZmZlci54LCBjb2xzIC0gMSk7XG4gICAgY29uc3QgY3Vyc29yQmxpbmsgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmN1cnNvckJsaW5rO1xuICAgIGNvbnN0IGN1cnNvclN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JTdHlsZTtcbiAgICBjb25zdCBjdXJzb3JJbmFjdGl2ZVN0eWxlID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5jdXJzb3JJbmFjdGl2ZVN0eWxlO1xuXG4gICAgLy8gcmVmcmVzaCByb3dzIHdpdGhpbiBsaW5rIHJhbmdlXG4gICAgZm9yIChsZXQgaSA9IHk7IGkgPD0geTI7ICsraSkge1xuICAgICAgY29uc3Qgcm93ID0gaSArIGJ1ZmZlci55ZGlzcDtcbiAgICAgIGNvbnN0IHJvd0VsZW1lbnQgPSB0aGlzLl9yb3dFbGVtZW50c1tpXTtcbiAgICAgIGNvbnN0IGJ1ZmZlcmxpbmUgPSBidWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgICBpZiAoIXJvd0VsZW1lbnQgfHwgIWJ1ZmZlcmxpbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByb3dFbGVtZW50LnJlcGxhY2VDaGlsZHJlbihcbiAgICAgICAgLi4udGhpcy5fcm93RmFjdG9yeS5jcmVhdGVSb3coXG4gICAgICAgICAgYnVmZmVybGluZSxcbiAgICAgICAgICByb3csXG4gICAgICAgICAgcm93ID09PSBjdXJzb3JBYnNvbHV0ZVksXG4gICAgICAgICAgY3Vyc29yU3R5bGUsXG4gICAgICAgICAgY3Vyc29ySW5hY3RpdmVTdHlsZSxcbiAgICAgICAgICBjdXJzb3JYLFxuICAgICAgICAgIGN1cnNvckJsaW5rLFxuICAgICAgICAgIHRoaXMuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCxcbiAgICAgICAgICB0aGlzLl93aWR0aENhY2hlLFxuICAgICAgICAgIGVuYWJsZWQgPyAoaSA9PT0geSA/IHggOiAwKSA6IC0xLFxuICAgICAgICAgIGVuYWJsZWQgPyAoKGkgPT09IHkyID8geDIgOiBjb2xzKSAtIDEpIDogLTFcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LCAyMDIzIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlckxpbmUsIElDZWxsRGF0YSwgSUNvbG9yIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9Db25zdGFudHMnO1xuaW1wb3J0IHsgV0hJVEVTUEFDRV9DRUxMX0NIQVIsIEF0dHJpYnV0ZXMgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgSUNvcmVTZXJ2aWNlLCBJRGVjb3JhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IgfSBmcm9tICdjb21tb24vQ29sb3InO1xuaW1wb3J0IHsgSUNoYXJhY3RlckpvaW5lclNlcnZpY2UsIElDb3JlQnJvd3NlclNlcnZpY2UsIElUaGVtZVNlcnZpY2UgfSBmcm9tICdicm93c2VyL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEpvaW5lZENlbGxEYXRhIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9DaGFyYWN0ZXJKb2luZXJTZXJ2aWNlJztcbmltcG9ydCB7IHRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1JlbmRlcmVyVXRpbHMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5pbXBvcnQgeyBXaWR0aENhY2hlIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9kb20vV2lkdGhDYWNoZSc7XG5pbXBvcnQgeyBJQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5cblxuZXhwb3J0IGNvbnN0IGVudW0gUm93Q3NzIHtcbiAgQk9MRF9DTEFTUyA9ICd4dGVybS1ib2xkJyxcbiAgRElNX0NMQVNTID0gJ3h0ZXJtLWRpbScsXG4gIElUQUxJQ19DTEFTUyA9ICd4dGVybS1pdGFsaWMnLFxuICBVTkRFUkxJTkVfQ0xBU1MgPSAneHRlcm0tdW5kZXJsaW5lJyxcbiAgT1ZFUkxJTkVfQ0xBU1MgPSAneHRlcm0tb3ZlcmxpbmUnLFxuICBTVFJJS0VUSFJPVUdIX0NMQVNTID0gJ3h0ZXJtLXN0cmlrZXRocm91Z2gnLFxuICBDVVJTT1JfQ0xBU1MgPSAneHRlcm0tY3Vyc29yJyxcbiAgQ1VSU09SX0JMSU5LX0NMQVNTID0gJ3h0ZXJtLWN1cnNvci1ibGluaycsXG4gIENVUlNPUl9TVFlMRV9CTE9DS19DTEFTUyA9ICd4dGVybS1jdXJzb3ItYmxvY2snLFxuICBDVVJTT1JfU1RZTEVfT1VUTElORV9DTEFTUyA9ICd4dGVybS1jdXJzb3Itb3V0bGluZScsXG4gIENVUlNPUl9TVFlMRV9CQVJfQ0xBU1MgPSAneHRlcm0tY3Vyc29yLWJhcicsXG4gIENVUlNPUl9TVFlMRV9VTkRFUkxJTkVfQ0xBU1MgPSAneHRlcm0tY3Vyc29yLXVuZGVybGluZSdcbn1cblxuXG5leHBvcnQgY2xhc3MgRG9tUmVuZGVyZXJSb3dGYWN0b3J5IHtcbiAgcHJpdmF0ZSBfd29ya0NlbGw6IENlbGxEYXRhID0gbmV3IENlbGxEYXRhKCk7XG5cbiAgcHJpdmF0ZSBfc2VsZWN0aW9uU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3NlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBkZWZhdWx0U3BhY2luZyA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIEBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jaGFyYWN0ZXJKb2luZXJTZXJ2aWNlOiBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSxcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgQElDb3JlQnJvd3NlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZUJyb3dzZXJTZXJ2aWNlOiBJQ29yZUJyb3dzZXJTZXJ2aWNlLFxuICAgIEBJQ29yZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZVNlcnZpY2U6IElDb3JlU2VydmljZSxcbiAgICBASURlY29yYXRpb25TZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2RlY29yYXRpb25TZXJ2aWNlOiBJRGVjb3JhdGlvblNlcnZpY2UsXG4gICAgQElUaGVtZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgZW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBjb2x1bW5TZWxlY3RNb2RlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLl9zZWxlY3Rpb25FbmQgPSBlbmQ7XG4gICAgdGhpcy5fY29sdW1uU2VsZWN0TW9kZSA9IGNvbHVtblNlbGVjdE1vZGU7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlUm93KFxuICAgIGxpbmVEYXRhOiBJQnVmZmVyTGluZSxcbiAgICByb3c6IG51bWJlcixcbiAgICBpc0N1cnNvclJvdzogYm9vbGVhbixcbiAgICBjdXJzb3JTdHlsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGN1cnNvckluYWN0aXZlU3R5bGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjdXJzb3JYOiBudW1iZXIsXG4gICAgY3Vyc29yQmxpbms6IGJvb2xlYW4sXG4gICAgY2VsbFdpZHRoOiBudW1iZXIsXG4gICAgd2lkdGhDYWNoZTogV2lkdGhDYWNoZSxcbiAgICBsaW5rU3RhcnQ6IG51bWJlcixcbiAgICBsaW5rRW5kOiBudW1iZXJcbiAgKTogSFRNTFNwYW5FbGVtZW50W10ge1xuXG4gICAgY29uc3QgZWxlbWVudHM6IEhUTUxTcGFuRWxlbWVudFtdID0gW107XG4gICAgY29uc3Qgam9pbmVkUmFuZ2VzID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyU2VydmljZS5nZXRKb2luZWRDaGFyYWN0ZXJzKHJvdyk7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5fdGhlbWVTZXJ2aWNlLmNvbG9ycztcblxuICAgIGxldCBsaW5lTGVuZ3RoID0gbGluZURhdGEuZ2V0Tm9CZ1RyaW1tZWRMZW5ndGgoKTtcbiAgICBpZiAoaXNDdXJzb3JSb3cgJiYgbGluZUxlbmd0aCA8IGN1cnNvclggKyAxKSB7XG4gICAgICBsaW5lTGVuZ3RoID0gY3Vyc29yWCArIDE7XG4gICAgfVxuXG4gICAgbGV0IGNoYXJFbGVtZW50OiBIVE1MU3BhbkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNlbGxBbW91bnQgPSAwO1xuICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgbGV0IG9sZEJnID0gMDtcbiAgICBsZXQgb2xkRmcgPSAwO1xuICAgIGxldCBvbGRFeHQgPSAwO1xuICAgIGxldCBvbGRMaW5rSG92ZXI6IG51bWJlciB8IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgb2xkU3BhY2luZyA9IDA7XG4gICAgbGV0IG9sZElzSW5TZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgc3BhY2luZyA9IDA7XG4gICAgY29uc3QgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnN0IGhhc0hvdmVyID0gbGlua1N0YXJ0ICE9PSAtMSAmJiBsaW5rRW5kICE9PSAtMTtcblxuICAgIGZvciAobGV0IHggPSAwOyB4IDwgbGluZUxlbmd0aDsgeCsrKSB7XG4gICAgICBsaW5lRGF0YS5sb2FkQ2VsbCh4LCB0aGlzLl93b3JrQ2VsbCk7XG4gICAgICBsZXQgd2lkdGggPSB0aGlzLl93b3JrQ2VsbC5nZXRXaWR0aCgpO1xuXG4gICAgICAvLyBUaGUgY2hhcmFjdGVyIHRvIHRoZSBsZWZ0IGlzIGEgd2lkZSBjaGFyYWN0ZXIsIGRyYXdpbmcgaXMgb3duZWQgYnkgdGhlIGNoYXIgYXQgeC0xXG4gICAgICBpZiAod2lkdGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50IGNoYXJhY3RlcihzKSB0byBkcmF3IHdlcmUgam9pbmVkLlxuICAgICAgbGV0IGlzSm9pbmVkID0gZmFsc2U7XG4gICAgICBsZXQgbGFzdENoYXJYID0geDtcblxuICAgICAgLy8gUHJvY2VzcyBhbnkgam9pbmVkIGNoYXJhY3RlciByYW5nZXMgYXMgbmVlZGVkLiBCZWNhdXNlIG9mIGhvdyB0aGVcbiAgICAgIC8vIHJhbmdlcyBhcmUgcHJvZHVjZWQsIHdlIGtub3cgdGhhdCB0aGV5IGFyZSB2YWxpZCBmb3IgdGhlIGNoYXJhY3RlcnNcbiAgICAgIC8vIGFuZCBhdHRyaWJ1dGVzIG9mIG91ciBpbnB1dC5cbiAgICAgIGxldCBjZWxsID0gdGhpcy5fd29ya0NlbGw7XG4gICAgICBpZiAoam9pbmVkUmFuZ2VzLmxlbmd0aCA+IDAgJiYgeCA9PT0gam9pbmVkUmFuZ2VzWzBdWzBdKSB7XG4gICAgICAgIGlzSm9pbmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSBqb2luZWRSYW5nZXMuc2hpZnQoKSE7XG5cbiAgICAgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoZSBleGFjdCBzdGFydCBhbmQgZW5kIGNvbHVtbiBvZiB0aGUgam9pbmVkIHJhbmdlLFxuICAgICAgICAvLyBzbyB3ZSBnZXQgdGhlIHN0cmluZyBhbmQgd2lkdGggcmVwcmVzZW50aW5nIGl0IGRpcmVjdGx5XG4gICAgICAgIGNlbGwgPSBuZXcgSm9pbmVkQ2VsbERhdGEoXG4gICAgICAgICAgdGhpcy5fd29ya0NlbGwsXG4gICAgICAgICAgbGluZURhdGEudHJhbnNsYXRlVG9TdHJpbmcodHJ1ZSwgcmFuZ2VbMF0sIHJhbmdlWzFdKSxcbiAgICAgICAgICByYW5nZVsxXSAtIHJhbmdlWzBdXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBjZWxscyBvY2N1cGllZCBieSB0aGlzIHJhbmdlIGluIHRoZSBsb29wXG4gICAgICAgIGxhc3RDaGFyWCA9IHJhbmdlWzFdIC0gMTtcblxuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB3aWR0aFxuICAgICAgICB3aWR0aCA9IGNlbGwuZ2V0V2lkdGgoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNJblNlbGVjdGlvbiA9IHRoaXMuX2lzQ2VsbEluU2VsZWN0aW9uKHgsIHJvdyk7XG4gICAgICBjb25zdCBpc0N1cnNvckNlbGwgPSBpc0N1cnNvclJvdyAmJiB4ID09PSBjdXJzb3JYO1xuICAgICAgY29uc3QgaXNMaW5rSG92ZXIgPSBoYXNIb3ZlciAmJiB4ID49IGxpbmtTdGFydCAmJiB4IDw9IGxpbmtFbmQ7XG5cbiAgICAgIGxldCBpc0RlY29yYXRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZm9yRWFjaERlY29yYXRpb25BdENlbGwoeCwgcm93LCB1bmRlZmluZWQsIGQgPT4ge1xuICAgICAgICBpc0RlY29yYXRlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgLy8gZ2V0IGNoYXJzIHRvIHJlbmRlciBmb3IgdGhpcyBjZWxsXG4gICAgICBsZXQgY2hhcnMgPSBjZWxsLmdldENoYXJzKCkgfHwgV0hJVEVTUEFDRV9DRUxMX0NIQVI7XG4gICAgICBpZiAoY2hhcnMgPT09ICcgJyAmJiAoY2VsbC5pc1VuZGVybGluZSgpIHx8IGNlbGwuaXNPdmVybGluZSgpKSkge1xuICAgICAgICBjaGFycyA9ICdcXHhhMCc7XG4gICAgICB9XG5cbiAgICAgIC8vIGxvb2t1cCBjaGFyIHJlbmRlciB3aWR0aCBhbmQgY2FsYyBzcGFjaW5nXG4gICAgICBzcGFjaW5nID0gd2lkdGggKiBjZWxsV2lkdGggLSB3aWR0aENhY2hlLmdldChjaGFycywgY2VsbC5pc0JvbGQoKSwgY2VsbC5pc0l0YWxpYygpKTtcblxuICAgICAgaWYgKCFjaGFyRWxlbWVudCkge1xuICAgICAgICBjaGFyRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBjaGFycyBjYW4gb25seSBiZSBtZXJnZWQgb24gZXhpc3Rpbmcgc3BhbiBpZjpcbiAgICAgICAgICogLSBleGlzdGluZyBzcGFuIG9ubHkgY29udGFpbnMgbWVyZ2VhYmxlIGNoYXJzIChjZWxsQW1vdW50ICE9IDApXG4gICAgICAgICAqIC0gYmcgZGlkIG5vdCBjaGFuZ2UgKG9yIGJvdGggYXJlIGluIHNlbGVjdGlvbilcbiAgICAgICAgICogLSBmZyBkaWQgbm90IGNoYW5nZSAob3IgYm90aCBhcmUgaW4gc2VsZWN0aW9uIGFuZCBzZWxlY3Rpb24gZmcgaXMgc2V0KVxuICAgICAgICAgKiAtIGV4dCBkaWQgbm90IGNoYW5nZVxuICAgICAgICAgKiAtIHVuZGVybGluZSBmcm9tIGhvdmVyIHN0YXRlIGRpZCBub3QgY2hhbmdlXG4gICAgICAgICAqIC0gY2VsbCBjb250ZW50IHJlbmRlcnMgdG8gc2FtZSBsZXR0ZXItc3BhY2luZ1xuICAgICAgICAgKiAtIGNlbGwgaXMgbm90IGN1cnNvclxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNlbGxBbW91bnRcbiAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAoaXNJblNlbGVjdGlvbiAmJiBvbGRJc0luU2VsZWN0aW9uKVxuICAgICAgICAgICAgfHwgKCFpc0luU2VsZWN0aW9uICYmICFvbGRJc0luU2VsZWN0aW9uICYmIGNlbGwuYmcgPT09IG9sZEJnKVxuICAgICAgICAgIClcbiAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAoaXNJblNlbGVjdGlvbiAmJiBvbGRJc0luU2VsZWN0aW9uICYmIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kKVxuICAgICAgICAgICAgfHwgY2VsbC5mZyA9PT0gb2xkRmdcbiAgICAgICAgICApXG4gICAgICAgICAgJiYgY2VsbC5leHRlbmRlZC5leHQgPT09IG9sZEV4dFxuICAgICAgICAgICYmIGlzTGlua0hvdmVyID09PSBvbGRMaW5rSG92ZXJcbiAgICAgICAgICAmJiBzcGFjaW5nID09PSBvbGRTcGFjaW5nXG4gICAgICAgICAgJiYgIWlzQ3Vyc29yQ2VsbFxuICAgICAgICAgICYmICFpc0pvaW5lZFxuICAgICAgICAgICYmICFpc0RlY29yYXRlZFxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBubyBzcGFuIGFsdGVyYXRpb25zLCB0aHVzIG9ubHkgYWNjb3VudCBjaGFycyBza2lwcGluZyBhbGwgY29kZSBiZWxvd1xuICAgICAgICAgIGlmIChjZWxsLmlzSW52aXNpYmxlKCkpIHtcbiAgICAgICAgICAgIHRleHQgKz0gV0hJVEVTUEFDRV9DRUxMX0NIQVI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRleHQgKz0gY2hhcnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNlbGxBbW91bnQrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiBjYW5ub3QgbWVyZ2U6XG4gICAgICAgICAgICogLSBhcHBseSBsZWZ0LW92ZXIgdGV4dCB0byBvbGQgc3BhblxuICAgICAgICAgICAqIC0gY3JlYXRlIG5ldyBzcGFuLCByZXNldCBzdGF0ZSBob2xkZXJzIGNlbGxBbW91bnQgJiB0ZXh0XG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKGNlbGxBbW91bnQpIHtcbiAgICAgICAgICAgIGNoYXJFbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hhckVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgY2VsbEFtb3VudCA9IDA7XG4gICAgICAgICAgdGV4dCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBwcmVzZXJ2ZSBjb25kaXRpb25zIGZvciBuZXh0IG1lcmdlciBldmFsIHJvdW5kXG4gICAgICBvbGRCZyA9IGNlbGwuYmc7XG4gICAgICBvbGRGZyA9IGNlbGwuZmc7XG4gICAgICBvbGRFeHQgPSBjZWxsLmV4dGVuZGVkLmV4dDtcbiAgICAgIG9sZExpbmtIb3ZlciA9IGlzTGlua0hvdmVyO1xuICAgICAgb2xkU3BhY2luZyA9IHNwYWNpbmc7XG4gICAgICBvbGRJc0luU2VsZWN0aW9uID0gaXNJblNlbGVjdGlvbjtcblxuICAgICAgaWYgKGlzSm9pbmVkKSB7XG4gICAgICAgIC8vIFRoZSBET00gcmVuZGVyZXIgY29sb3JzIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBjdXJzb3IgYnV0IGZvciBsaWdhdHVyZXMgYWxsIGNlbGxzIGFyZVxuICAgICAgICAvLyBqb2luZWQuIFRoZSB3b3JrYXJvdW5kIGhlcmUgaXMgdG8gc2hvdyBhIGN1cnNvciBhcm91bmQgdGhlIHdob2xlIGxpZ2F0dXJlIHNvIGl0IHNob3dzIHVwLFxuICAgICAgICAvLyB0aGUgY3Vyc29yIGxvb2tzIHRoZSBzYW1lIHdoZW4gb24gYW55IGNoYXJhY3RlciBvZiB0aGUgbGlnYXR1cmUgdGhvdWdoXG4gICAgICAgIGlmIChjdXJzb3JYID49IHggJiYgY3Vyc29yWCA8PSBsYXN0Q2hhclgpIHtcbiAgICAgICAgICBjdXJzb3JYID0geDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuX2NvcmVTZXJ2aWNlLmlzQ3Vyc29ySGlkZGVuICYmIGlzQ3Vyc29yQ2VsbCAmJiB0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckluaXRpYWxpemVkKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX0NMQVNTKTtcbiAgICAgICAgaWYgKHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICBpZiAoY3Vyc29yQmxpbmspIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX0JMSU5LX0NMQVNTKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKFxuICAgICAgICAgICAgY3Vyc29yU3R5bGUgPT09ICdiYXInXG4gICAgICAgICAgICAgID8gUm93Q3NzLkNVUlNPUl9TVFlMRV9CQVJfQ0xBU1NcbiAgICAgICAgICAgICAgOiBjdXJzb3JTdHlsZSA9PT0gJ3VuZGVybGluZSdcbiAgICAgICAgICAgICAgICA/IFJvd0Nzcy5DVVJTT1JfU1RZTEVfVU5ERVJMSU5FX0NMQVNTXG4gICAgICAgICAgICAgICAgOiBSb3dDc3MuQ1VSU09SX1NUWUxFX0JMT0NLX0NMQVNTXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY3Vyc29ySW5hY3RpdmVTdHlsZSkge1xuICAgICAgICAgICAgc3dpdGNoIChjdXJzb3JJbmFjdGl2ZVN0eWxlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ291dGxpbmUnOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX1NUWUxFX09VVExJTkVfQ0xBU1MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdibG9jayc6XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5DVVJTT1JfU1RZTEVfQkxPQ0tfQ0xBU1MpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdiYXInOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChSb3dDc3MuQ1VSU09SX1NUWUxFX0JBUl9DTEFTUyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3VuZGVybGluZSc6XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5DVVJTT1JfU1RZTEVfVU5ERVJMSU5FX0NMQVNTKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNCb2xkKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5CT0xEX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNlbGwuaXNJdGFsaWMoKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLklUQUxJQ19DTEFTUyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzRGltKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5ESU1fQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc0ludmlzaWJsZSgpKSB7XG4gICAgICAgIHRleHQgPSBXSElURVNQQUNFX0NFTExfQ0hBUjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHQgPSBjZWxsLmdldENoYXJzKCkgfHwgV0hJVEVTUEFDRV9DRUxMX0NIQVI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjZWxsLmlzVW5kZXJsaW5lKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKGAke1Jvd0Nzcy5VTkRFUkxJTkVfQ0xBU1N9LSR7Y2VsbC5leHRlbmRlZC51bmRlcmxpbmVTdHlsZX1gKTtcbiAgICAgICAgaWYgKHRleHQgPT09ICcgJykge1xuICAgICAgICAgIHRleHQgPSAnXFx4YTAnOyAvLyA9ICZuYnNwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2VsbC5pc1VuZGVybGluZUNvbG9yRGVmYXVsdCgpKSB7XG4gICAgICAgICAgaWYgKGNlbGwuaXNVbmRlcmxpbmVDb2xvclJHQigpKSB7XG4gICAgICAgICAgICBjaGFyRWxlbWVudC5zdHlsZS50ZXh0RGVjb3JhdGlvbkNvbG9yID0gYHJnYigke0F0dHJpYnV0ZURhdGEudG9Db2xvclJHQihjZWxsLmdldFVuZGVybGluZUNvbG9yKCkpLmpvaW4oJywnKX0pYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZnID0gY2VsbC5nZXRVbmRlcmxpbmVDb2xvcigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMgJiYgY2VsbC5pc0JvbGQoKSAmJiBmZyA8IDgpIHtcbiAgICAgICAgICAgICAgZmcgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNoYXJFbGVtZW50LnN0eWxlLnRleHREZWNvcmF0aW9uQ29sb3IgPSBjb2xvcnMuYW5zaVtmZ10uY3NzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc092ZXJsaW5lKCkpIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKFJvd0Nzcy5PVkVSTElORV9DTEFTUyk7XG4gICAgICAgIGlmICh0ZXh0ID09PSAnICcpIHtcbiAgICAgICAgICB0ZXh0ID0gJ1xceGEwJzsgLy8gPSAmbmJzcDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2VsbC5pc1N0cmlrZXRocm91Z2goKSkge1xuICAgICAgICBjbGFzc2VzLnB1c2goUm93Q3NzLlNUUklLRVRIUk9VR0hfQ0xBU1MpO1xuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBsaW5rIGhvdmVyIHVuZGVybGluZSBsYXRlLCBlZmZlY3RpdmVseSBvdmVycmlkZXMgYW55IHByZXZpb3VzIHRleHQtZGVjb3JhdGlvblxuICAgICAgLy8gc2V0dGluZ3NcbiAgICAgIGlmIChpc0xpbmtIb3Zlcikge1xuICAgICAgICBjaGFyRWxlbWVudC5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICd1bmRlcmxpbmUnO1xuICAgICAgfVxuXG4gICAgICBsZXQgZmcgPSBjZWxsLmdldEZnQ29sb3IoKTtcbiAgICAgIGxldCBmZ0NvbG9yTW9kZSA9IGNlbGwuZ2V0RmdDb2xvck1vZGUoKTtcbiAgICAgIGxldCBiZyA9IGNlbGwuZ2V0QmdDb2xvcigpO1xuICAgICAgbGV0IGJnQ29sb3JNb2RlID0gY2VsbC5nZXRCZ0NvbG9yTW9kZSgpO1xuICAgICAgY29uc3QgaXNJbnZlcnNlID0gISFjZWxsLmlzSW52ZXJzZSgpO1xuICAgICAgaWYgKGlzSW52ZXJzZSkge1xuICAgICAgICBjb25zdCB0ZW1wID0gZmc7XG4gICAgICAgIGZnID0gYmc7XG4gICAgICAgIGJnID0gdGVtcDtcbiAgICAgICAgY29uc3QgdGVtcDIgPSBmZ0NvbG9yTW9kZTtcbiAgICAgICAgZmdDb2xvck1vZGUgPSBiZ0NvbG9yTW9kZTtcbiAgICAgICAgYmdDb2xvck1vZGUgPSB0ZW1wMjtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgYW55IGRlY29yYXRpb24gZm9yZWdyb3VuZC9iYWNrZ3JvdW5kIG92ZXJyaWRlcywgdGhpcyBtdXN0IGhhcHBlbiBhZnRlciBpbnZlcnNlIGhhc1xuICAgICAgLy8gYmVlbiBhcHBsaWVkXG4gICAgICBsZXQgYmdPdmVycmlkZTogSUNvbG9yIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGZnT3ZlcnJpZGU6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBpc1RvcCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGVjb3JhdGlvblNlcnZpY2UuZm9yRWFjaERlY29yYXRpb25BdENlbGwoeCwgcm93LCB1bmRlZmluZWQsIGQgPT4ge1xuICAgICAgICBpZiAoZC5vcHRpb25zLmxheWVyICE9PSAndG9wJyAmJiBpc1RvcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZC5iYWNrZ3JvdW5kQ29sb3JSR0IpIHtcbiAgICAgICAgICBiZ0NvbG9yTW9kZSA9IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICAgIGJnID0gZC5iYWNrZ3JvdW5kQ29sb3JSR0IucmdiYSA+PiA4ICYgMHhGRkZGRkY7XG4gICAgICAgICAgYmdPdmVycmlkZSA9IGQuYmFja2dyb3VuZENvbG9yUkdCO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkLmZvcmVncm91bmRDb2xvclJHQikge1xuICAgICAgICAgIGZnQ29sb3JNb2RlID0gQXR0cmlidXRlcy5DTV9SR0I7XG4gICAgICAgICAgZmcgPSBkLmZvcmVncm91bmRDb2xvclJHQi5yZ2JhID4+IDggJiAweEZGRkZGRjtcbiAgICAgICAgICBmZ092ZXJyaWRlID0gZC5mb3JlZ3JvdW5kQ29sb3JSR0I7XG4gICAgICAgIH1cbiAgICAgICAgaXNUb3AgPSBkLm9wdGlvbnMubGF5ZXIgPT09ICd0b3AnO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEFwcGx5IHNlbGVjdGlvblxuICAgICAgaWYgKCFpc1RvcCAmJiBpc0luU2VsZWN0aW9uKSB7XG4gICAgICAgIC8vIElmIGluIHRoZSBzZWxlY3Rpb24sIGZvcmNlIHRoZSBlbGVtZW50IHRvIGJlIGFib3ZlIHRoZSBzZWxlY3Rpb24gdG8gaW1wcm92ZSBjb250cmFzdCBhbmRcbiAgICAgICAgLy8gc3VwcG9ydCBvcGFxdWUgc2VsZWN0aW9ucy4gVGhlIGFwcGxpZXMgYmFja2dyb3VuZCBpcyBub3QgYWN0dWFsbHkgbmVlZGVkIGhlcmUgYXNcbiAgICAgICAgLy8gc2VsZWN0aW9uIGlzIGRyYXduIGluIGEgc2VwZXJhdGUgY29udGFpbmVyLCB0aGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgdG8gZW5zdXJpbmcgbWluaW11bVxuICAgICAgICAvLyBjb250cmFzdCByYXRpb1xuICAgICAgICBiZ092ZXJyaWRlID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLmlzRm9jdXNlZCA/IGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kT3BhcXVlIDogY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZTtcbiAgICAgICAgYmcgPSBiZ092ZXJyaWRlLnJnYmEgPj4gOCAmIDB4RkZGRkZGO1xuICAgICAgICBiZ0NvbG9yTW9kZSA9IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgICAvLyBTaW5jZSBhbiBvcGFxdWUgc2VsZWN0aW9uIGlzIGJlaW5nIHJlbmRlcmVkLCB0aGUgc2VsZWN0aW9uIHByZXRlbmRzIHRvIGJlIGEgZGVjb3JhdGlvbiB0b1xuICAgICAgICAvLyBlbnN1cmUgdGV4dCBpcyBkcmF3biBhYm92ZSB0aGUgc2VsZWN0aW9uLlxuICAgICAgICBpc1RvcCA9IHRydWU7XG4gICAgICAgIC8vIEFwcGx5IHNlbGVjdGlvbiBmb3JlZ3JvdW5kIGlmIGFwcGxpY2FibGVcbiAgICAgICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kKSB7XG4gICAgICAgICAgZmdDb2xvck1vZGUgPSBBdHRyaWJ1dGVzLkNNX1JHQjtcbiAgICAgICAgICBmZyA9IGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kLnJnYmEgPj4gOCAmIDB4RkZGRkZGO1xuICAgICAgICAgIGZnT3ZlcnJpZGUgPSBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBpdCdzIGEgdG9wIGRlY29yYXRpb24sIHJlbmRlciBhYm92ZSB0aGUgc2VsZWN0aW9uXG4gICAgICBpZiAoaXNUb3ApIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCd4dGVybS1kZWNvcmF0aW9uLXRvcCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBCYWNrZ3JvdW5kXG4gICAgICBsZXQgcmVzb2x2ZWRCZzogSUNvbG9yO1xuICAgICAgc3dpdGNoIChiZ0NvbG9yTW9kZSkge1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDI1NjpcbiAgICAgICAgICByZXNvbHZlZEJnID0gY29sb3JzLmFuc2lbYmddO1xuICAgICAgICAgIGNsYXNzZXMucHVzaChgeHRlcm0tYmctJHtiZ31gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICByZXNvbHZlZEJnID0gY2hhbm5lbHMudG9Db2xvcihiZyA+PiAxNiwgYmcgPj4gOCAmIDB4RkYsIGJnICYgMHhGRik7XG4gICAgICAgICAgdGhpcy5fYWRkU3R5bGUoY2hhckVsZW1lbnQsIGBiYWNrZ3JvdW5kLWNvbG9yOiMke3BhZFN0YXJ0KChiZyA+Pj4gMCkudG9TdHJpbmcoMTYpLCAnMCcsIDYpfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNJbnZlcnNlKSB7XG4gICAgICAgICAgICByZXNvbHZlZEJnID0gY29sb3JzLmZvcmVncm91bmQ7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goYHh0ZXJtLWJnLSR7SU5WRVJURURfREVGQVVMVF9DT0xPUn1gKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZWRCZyA9IGNvbG9ycy5iYWNrZ3JvdW5kO1xuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gYmFja2dyb3VuZCBvdmVycmlkZSBieSBub3cgaXQncyB0aGUgb3JpZ2luYWwgY29sb3IsIHNvIGFwcGx5IGRpbSBpZiBuZWVkZWRcbiAgICAgIGlmICghYmdPdmVycmlkZSkge1xuICAgICAgICBpZiAoY2VsbC5pc0RpbSgpKSB7XG4gICAgICAgICAgYmdPdmVycmlkZSA9IGNvbG9yLm11bHRpcGx5T3BhY2l0eShyZXNvbHZlZEJnLCAwLjUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZvcmVncm91bmRcbiAgICAgIHN3aXRjaCAoZmdDb2xvck1vZGUpIHtcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6XG4gICAgICAgICAgaWYgKGNlbGwuaXNCb2xkKCkgJiYgZmcgPCA4ICYmIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnMpIHtcbiAgICAgICAgICAgIGZnICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5fYXBwbHlNaW5pbXVtQ29udHJhc3QoY2hhckVsZW1lbnQsIHJlc29sdmVkQmcsIGNvbG9ycy5hbnNpW2ZnXSwgY2VsbCwgYmdPdmVycmlkZSwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKGB4dGVybS1mZy0ke2ZnfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjpcbiAgICAgICAgICBjb25zdCBjb2xvciA9IGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAgICAgICAoZmcgPj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgIChmZyA+PiAgOCkgJiAweEZGLFxuICAgICAgICAgICAgKGZnICAgICAgKSAmIDB4RkZcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghdGhpcy5fYXBwbHlNaW5pbXVtQ29udHJhc3QoY2hhckVsZW1lbnQsIHJlc29sdmVkQmcsIGNvbG9yLCBjZWxsLCBiZ092ZXJyaWRlLCBmZ092ZXJyaWRlKSkge1xuICAgICAgICAgICAgdGhpcy5fYWRkU3R5bGUoY2hhckVsZW1lbnQsIGBjb2xvcjojJHtwYWRTdGFydChmZy50b1N0cmluZygxNiksICcwJywgNil9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fREVGQVVMVDpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIXRoaXMuX2FwcGx5TWluaW11bUNvbnRyYXN0KGNoYXJFbGVtZW50LCByZXNvbHZlZEJnLCBjb2xvcnMuZm9yZWdyb3VuZCwgY2VsbCwgYmdPdmVycmlkZSwgZmdPdmVycmlkZSkpIHtcbiAgICAgICAgICAgIGlmIChpc0ludmVyc2UpIHtcbiAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKGB4dGVybS1mZy0ke0lOVkVSVEVEX0RFRkFVTFRfQ09MT1J9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBDU1MgY2xhc3Nlc1xuICAgICAgLy8gc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdXNpbmcgY2xhc3NMaXN0IGJ5IG9taXR0aW5nXG4gICAgICAvLyBjaGVja3MgZm9yIGRvdWJsZWQgZW50cmllcyAoY29kZSBhYm92ZSBzaG91bGQgbm90IGhhdmUgZG91YmxldHMpXG4gICAgICBpZiAoY2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgY2hhckVsZW1lbnQuY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgICAgIGNsYXNzZXMubGVuZ3RoID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gZXhjbHVkZSBjb25kaXRpb25zIGZvciBjZWxsIG1lcmdpbmcgLSBuZXZlciBtZXJnZSB0aGVzZVxuICAgICAgaWYgKCFpc0N1cnNvckNlbGwgJiYgIWlzSm9pbmVkICYmICFpc0RlY29yYXRlZCkge1xuICAgICAgICBjZWxsQW1vdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFyRWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICB9XG4gICAgICAvLyBhcHBseSBsZXR0ZXItc3BhY2luZyBydWxlXG4gICAgICBpZiAoc3BhY2luZyAhPT0gdGhpcy5kZWZhdWx0U3BhY2luZykge1xuICAgICAgICBjaGFyRWxlbWVudC5zdHlsZS5sZXR0ZXJTcGFjaW5nID0gYCR7c3BhY2luZ31weGA7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnRzLnB1c2goY2hhckVsZW1lbnQpO1xuICAgICAgeCA9IGxhc3RDaGFyWDtcbiAgICB9XG5cbiAgICAvLyBwb3N0Zml4IHRleHQgb2YgbGFzdCBtZXJnZWQgc3BhblxuICAgIGlmIChjaGFyRWxlbWVudCAmJiBjZWxsQW1vdW50KSB7XG4gICAgICBjaGFyRWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlNaW5pbXVtQ29udHJhc3QoZWxlbWVudDogSFRNTEVsZW1lbnQsIGJnOiBJQ29sb3IsIGZnOiBJQ29sb3IsIGNlbGw6IElDZWxsRGF0YSwgYmdPdmVycmlkZTogSUNvbG9yIHwgdW5kZWZpbmVkLCBmZ092ZXJyaWRlOiBJQ29sb3IgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5taW5pbXVtQ29udHJhc3RSYXRpbyA9PT0gMSB8fCB0cmVhdEdseXBoQXNCYWNrZ3JvdW5kQ29sb3IoY2VsbC5nZXRDb2RlKCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVHJ5IGdldCBmcm9tIGNhY2hlIGZpcnN0LCBvbmx5IHVzZSB0aGUgY2FjaGUgd2hlbiB0aGVyZSBhcmUgbm8gZGVjb3JhdGlvbiBvdmVycmlkZXNcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuX2dldENvbnRyYXN0Q2FjaGUoY2VsbCk7XG4gICAgbGV0IGFkanVzdGVkQ29sb3I6IElDb2xvciB8IHVuZGVmaW5lZCB8IG51bGwgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCFiZ092ZXJyaWRlICYmICFmZ092ZXJyaWRlKSB7XG4gICAgICBhZGp1c3RlZENvbG9yID0gY2FjaGUuZ2V0Q29sb3IoYmcucmdiYSwgZmcucmdiYSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBzdG9yZSBpbiBjYWNoZVxuICAgIGlmIChhZGp1c3RlZENvbG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERpbSBjZWxscyBvbmx5IHJlcXVpcmUgaGFsZiB0aGUgY29udHJhc3QsIG90aGVyd2lzZSB0aGV5IHdvdWxkbid0IGJlIGRpc3Rpbmd1aXNoYWJsZSBmcm9tXG4gICAgICAvLyBub24tZGltIGNlbGxzXG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWluaW11bUNvbnRyYXN0UmF0aW8gLyAoY2VsbC5pc0RpbSgpID8gMiA6IDEpO1xuICAgICAgYWRqdXN0ZWRDb2xvciA9IGNvbG9yLmVuc3VyZUNvbnRyYXN0UmF0aW8oYmdPdmVycmlkZSB8fCBiZywgZmdPdmVycmlkZSB8fCBmZywgcmF0aW8pO1xuICAgICAgY2FjaGUuc2V0Q29sb3IoKGJnT3ZlcnJpZGUgfHwgYmcpLnJnYmEsIChmZ092ZXJyaWRlIHx8IGZnKS5yZ2JhLCBhZGp1c3RlZENvbG9yID8/IG51bGwpO1xuICAgIH1cblxuICAgIGlmIChhZGp1c3RlZENvbG9yKSB7XG4gICAgICB0aGlzLl9hZGRTdHlsZShlbGVtZW50LCBgY29sb3I6JHthZGp1c3RlZENvbG9yLmNzc31gKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENvbnRyYXN0Q2FjaGUoY2VsbDogSUNlbGxEYXRhKTogSUNvbG9yQ29udHJhc3RDYWNoZSB7XG4gICAgaWYgKGNlbGwuaXNEaW0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RoZW1lU2VydmljZS5jb2xvcnMuaGFsZkNvbnRyYXN0Q2FjaGU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl90aGVtZVNlcnZpY2UuY29sb3JzLmNvbnRyYXN0Q2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF9hZGRTdHlsZShlbGVtZW50OiBIVE1MRWxlbWVudCwgc3R5bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIGAke2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdzdHlsZScpIHx8ICcnfSR7c3R5bGV9O2ApO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNDZWxsSW5TZWxlY3Rpb24oeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuX3NlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX3NlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbHVtblNlbGVjdE1vZGUpIHtcbiAgICAgIGlmIChzdGFydFswXSA8PSBlbmRbMF0pIHtcbiAgICAgICAgcmV0dXJuIHggPj0gc3RhcnRbMF0gJiYgeSA+PSBzdGFydFsxXSAmJlxuICAgICAgICAgIHggPCBlbmRbMF0gJiYgeSA8PSBlbmRbMV07XG4gICAgICB9XG4gICAgICByZXR1cm4geCA8IHN0YXJ0WzBdICYmIHkgPj0gc3RhcnRbMV0gJiZcbiAgICAgICAgeCA+PSBlbmRbMF0gJiYgeSA8PSBlbmRbMV07XG4gICAgfVxuICAgIHJldHVybiAoeSA+IHN0YXJ0WzFdICYmIHkgPCBlbmRbMV0pIHx8XG4gICAgICAgIChzdGFydFsxXSA9PT0gZW5kWzFdICYmIHkgPT09IHN0YXJ0WzFdICYmIHggPj0gc3RhcnRbMF0gJiYgeCA8IGVuZFswXSkgfHxcbiAgICAgICAgKHN0YXJ0WzFdIDwgZW5kWzFdICYmIHkgPT09IGVuZFsxXSAmJiB4IDwgZW5kWzBdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPCBlbmRbMV0gJiYgeSA9PT0gc3RhcnRbMV0gJiYgeCA+PSBzdGFydFswXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFkU3RhcnQodGV4dDogc3RyaW5nLCBwYWRDaGFyOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgd2hpbGUgKHRleHQubGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgdGV4dCA9IHBhZENoYXIgKyB0ZXh0O1xuICB9XG4gIHJldHVybiB0ZXh0O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBGb250V2VpZ2h0IH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuXG5leHBvcnQgY29uc3QgZW51bSBXaWR0aENhY2hlU2V0dGluZ3Mge1xuICAvKiogc2VudGluZWwgZm9yIHVuc2V0IHZhbHVlcyBpbiBmbGF0IGNhY2hlICovXG4gIEZMQVRfVU5TRVQgPSAtOTk5OSxcbiAgLyoqIHNpemUgb2YgZmxhdCBjYWNoZSwgc2l6ZS0xIGVxdWFscyBoaWdoZXN0IGNvZGVwb2ludCBoYW5kbGVkIGJ5IGZsYXQgKi9cbiAgRkxBVF9TSVpFID0gMjU2LFxuICAvKiogY2hhciByZXBlYXQgZm9yIG1lYXN1cmluZyAqL1xuICBSRVBFQVQgPSAzMlxufVxuXG5cbmNvbnN0IGVudW0gRm9udFZhcmlhbnQge1xuICBSRUdVTEFSID0gMCxcbiAgQk9MRCA9IDEsXG4gIElUQUxJQyA9IDIsXG4gIEJPTERfSVRBTElDID0gM1xufVxuXG5cbmV4cG9ydCBjbGFzcyBXaWR0aENhY2hlIGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICAvLyBmbGF0IGNhY2hlIGZvciByZWd1bGFyIHZhcmlhbnQgdXAgdG8gQ2FjaGVTZXR0aW5ncy5GTEFUX1NJWkVcbiAgLy8gTk9URTogfjR4IGZhc3RlciBhY2Nlc3MgdGhhbiBob2xleSAoc2VydmluZyA+PjgwJSBvZiB0ZXJtaW5hbCBjb250ZW50KVxuICAvLyAgICAgICBJdCBoYXMgYSBzbWFsbCBtZW1vcnkgZm9vdHByaW50IChvbmx5IDFNQiBmb3IgZnVsbCBCTVAgY2FjaGluZyksXG4gIC8vICAgICAgIHN0aWxsIHRoZSBzd2VldCBzcG90IGlzIG5vdCByZWFjaGVkIGJlZm9yZSB0b3VjaGluZyAzMmsgZGlmZmVyZW50IGNvZGVwb2ludHMsXG4gIC8vICAgICAgIHRodXMgd2Ugc3RvcmUgdGhlIHJlbWFpbmluZyA8PDIwJSBvZiB0ZXJtaW5hbCBkYXRhIGluIGEgaG9sZXkgc3RydWN0dXJlLlxuICBwcm90ZWN0ZWQgX2ZsYXQgPSBuZXcgRmxvYXQzMkFycmF5KFdpZHRoQ2FjaGVTZXR0aW5ncy5GTEFUX1NJWkUpO1xuXG4gIC8vIGhvbGV5IGNhY2hlIGZvciBib2xkLCBpdGFsaWMgYW5kIGJvbGQmaXRhbGljIGZvciBhbnkgc3RyaW5nXG4gIC8vIEZJWE1FOiBjYW4gZ3JvdyByZWFsbHkgYmlnIG92ZXIgdGltZSAofjguNSBNQiBmb3IgZnVsbCBCTVAgY2FjaGluZyksXG4gIC8vICAgICAgICBzbyBhIHNoYXJlZCBBUEkgYWNyb3NzIHRlcm1pbmFscyBpcyBuZWVkZWRcbiAgcHJvdGVjdGVkIF9ob2xleTogTWFwPHN0cmluZywgbnVtYmVyPiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9mb250ID0gJyc7XG4gIHByaXZhdGUgX2ZvbnRTaXplID0gMDtcbiAgcHJpdmF0ZSBfd2VpZ2h0OiBGb250V2VpZ2h0ID0gJ25vcm1hbCc7XG4gIHByaXZhdGUgX3dlaWdodEJvbGQ6IEZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gIHByaXZhdGUgX2NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX21lYXN1cmVFbGVtZW50czogSFRNTFNwYW5FbGVtZW50W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihfZG9jdW1lbnQ6IERvY3VtZW50LCBfaGVscGVyQ29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuX2NvbnRhaW5lciA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLl9jb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0td2lkdGgtY2FjaGUtbWVhc3VyZS1jb250YWluZXInKTtcbiAgICB0aGlzLl9jb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgLy8gU1Agc2hvdWxkIHN0YWNrIGluIHNwYW5zXG4gICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSAncHJlJztcbiAgICAvLyBhdm9pZCB1bmRlcmN1dHMgaW4gbm9uLW1vbm9zcGFjZSBmb250cyBmcm9tIGtlcm5pbmdcbiAgICB0aGlzLl9jb250YWluZXIuc3R5bGUuZm9udEtlcm5pbmcgPSAnbm9uZSc7XG5cbiAgICBjb25zdCByZWd1bGFyID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICByZWd1bGFyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50Jyk7XG5cbiAgICBjb25zdCBib2xkID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBib2xkLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50Jyk7XG4gICAgYm9sZC5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xuXG4gICAgY29uc3QgaXRhbGljID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBpdGFsaWMuY2xhc3NMaXN0LmFkZCgneHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQnKTtcbiAgICBpdGFsaWMuc3R5bGUuZm9udFN0eWxlID0gJ2l0YWxpYyc7XG5cbiAgICBjb25zdCBib2xkSXRhbGljID0gX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBib2xkSXRhbGljLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWNoYXItbWVhc3VyZS1lbGVtZW50Jyk7XG4gICAgYm9sZEl0YWxpYy5zdHlsZS5mb250V2VpZ2h0ID0gJ2JvbGQnO1xuICAgIGJvbGRJdGFsaWMuc3R5bGUuZm9udFN0eWxlID0gJ2l0YWxpYyc7XG5cbiAgICAvLyBOT1RFOiBtdXN0IGJlIGluIG9yZGVyIG9mIEZvbnRWYXJpYW50XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnRzID0gW3JlZ3VsYXIsIGJvbGQsIGl0YWxpYywgYm9sZEl0YWxpY107XG4gICAgdGhpcy5fY29udGFpbmVyLmFwcGVuZENoaWxkKHJlZ3VsYXIpO1xuICAgIHRoaXMuX2NvbnRhaW5lci5hcHBlbmRDaGlsZChib2xkKTtcbiAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoaXRhbGljKTtcbiAgICB0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQoYm9sZEl0YWxpYyk7XG5cbiAgICBfaGVscGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG5cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jb250YWluZXIucmVtb3ZlKCk7ICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudHMgZnJvbSBET01cbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudHMubGVuZ3RoID0gMDsgICAvLyByZWxlYXNlIGVsZW1lbnQgcmVmc1xuICAgIHRoaXMuX2hvbGV5ID0gdW5kZWZpbmVkOyAgICAgICAgICAgIC8vIGZyZWUgY2FjaGUgbWVtb3J5IHZpYSBHQ1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSB3aWR0aCBjYWNoZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9mbGF0LmZpbGwoV2lkdGhDYWNoZVNldHRpbmdzLkZMQVRfVU5TRVQpO1xuICAgIC8vIC5jbGVhcigpIGhhcyBzb21lIG92ZXJoZWFkLCByZS1hc3NpZ24gaW5zdGVhZCAoPjMgdGltZXMgZmFzdGVyKVxuICAgIHRoaXMuX2hvbGV5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZvbnQgZm9yIG1lYXN1cmluZy5cbiAgICogTXVzdCBiZSBjYWxsZWQgZm9yIGFueSBjaGFuZ2VzIG9uIGZvbnQgc2V0dGluZ3MuXG4gICAqIEFsc28gY2xlYXJzIHRoZSBjYWNoZS5cbiAgICovXG4gIHB1YmxpYyBzZXRGb250KGZvbnQ6IHN0cmluZywgZm9udFNpemU6IG51bWJlciwgd2VpZ2h0OiBGb250V2VpZ2h0LCB3ZWlnaHRCb2xkOiBGb250V2VpZ2h0KTogdm9pZCB7XG4gICAgLy8gc2tpcCBpZiBub3RoaW5nIGNoYW5nZWRcbiAgICBpZiAoZm9udCA9PT0gdGhpcy5fZm9udFxuICAgICAgJiYgZm9udFNpemUgPT09IHRoaXMuX2ZvbnRTaXplXG4gICAgICAmJiB3ZWlnaHQgPT09IHRoaXMuX3dlaWdodFxuICAgICAgJiYgd2VpZ2h0Qm9sZCA9PT0gdGhpcy5fd2VpZ2h0Qm9sZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2ZvbnQgPSBmb250O1xuICAgIHRoaXMuX2ZvbnRTaXplID0gZm9udFNpemU7XG4gICAgdGhpcy5fd2VpZ2h0ID0gd2VpZ2h0O1xuICAgIHRoaXMuX3dlaWdodEJvbGQgPSB3ZWlnaHRCb2xkO1xuXG4gICAgdGhpcy5fY29udGFpbmVyLnN0eWxlLmZvbnRGYW1pbHkgPSB0aGlzLl9mb250O1xuICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5mb250U2l6ZSA9IGAke3RoaXMuX2ZvbnRTaXplfXB4YDtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudHNbRm9udFZhcmlhbnQuUkVHVUxBUl0uc3R5bGUuZm9udFdlaWdodCA9IGAke3dlaWdodH1gO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50c1tGb250VmFyaWFudC5CT0xEXS5zdHlsZS5mb250V2VpZ2h0ID0gYCR7d2VpZ2h0Qm9sZH1gO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50c1tGb250VmFyaWFudC5JVEFMSUNdLnN0eWxlLmZvbnRXZWlnaHQgPSBgJHt3ZWlnaHR9YDtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudHNbRm9udFZhcmlhbnQuQk9MRF9JVEFMSUNdLnN0eWxlLmZvbnRXZWlnaHQgPSBgJHt3ZWlnaHRCb2xkfWA7XG5cbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSByZW5kZXIgd2lkdGggZm9yIGNlbGwgY29udGVudCBgY2Agd2l0aCBjdXJyZW50IGZvbnQgc2V0dGluZ3MuXG4gICAqIGB2YXJpYW50YCBkZW5vdGVzIHRoZSBmb250IHZhcmlhbnQgdG8gYmUgdXNlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoYzogc3RyaW5nLCBib2xkOiBib29sZWFuIHwgbnVtYmVyLCBpdGFsaWM6IGJvb2xlYW4gfCBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBjcCA9IDA7XG4gICAgaWYgKCFib2xkICYmICFpdGFsaWMgJiYgYy5sZW5ndGggPT09IDEgJiYgKGNwID0gYy5jaGFyQ29kZUF0KDApKSA8IFdpZHRoQ2FjaGVTZXR0aW5ncy5GTEFUX1NJWkUpIHtcbiAgICAgIGlmICh0aGlzLl9mbGF0W2NwXSAhPT0gV2lkdGhDYWNoZVNldHRpbmdzLkZMQVRfVU5TRVQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZsYXRbY3BdO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLl9tZWFzdXJlKGMsIDApO1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0aGlzLl9mbGF0W2NwXSA9IHdpZHRoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdpZHRoO1xuICAgIH1cbiAgICBsZXQga2V5ID0gYztcbiAgICBpZiAoYm9sZCkga2V5ICs9ICdCJztcbiAgICBpZiAoaXRhbGljKSBrZXkgKz0gJ0knO1xuICAgIGxldCB3aWR0aCA9IHRoaXMuX2hvbGV5IS5nZXQoa2V5KTtcbiAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IHZhcmlhbnQgPSAwO1xuICAgICAgaWYgKGJvbGQpIHZhcmlhbnQgfD0gRm9udFZhcmlhbnQuQk9MRDtcbiAgICAgIGlmIChpdGFsaWMpIHZhcmlhbnQgfD0gRm9udFZhcmlhbnQuSVRBTElDO1xuICAgICAgd2lkdGggPSB0aGlzLl9tZWFzdXJlKGMsIHZhcmlhbnQpO1xuICAgICAgaWYgKHdpZHRoID4gMCkge1xuICAgICAgICB0aGlzLl9ob2xleSEuc2V0KGtleSwgd2lkdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gd2lkdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgX21lYXN1cmUoYzogc3RyaW5nLCB2YXJpYW50OiBGb250VmFyaWFudCk6IG51bWJlciB7XG4gICAgY29uc3QgZWwgPSB0aGlzLl9tZWFzdXJlRWxlbWVudHNbdmFyaWFudF07XG4gICAgZWwudGV4dENvbnRlbnQgPSBjLnJlcGVhdChXaWR0aENhY2hlU2V0dGluZ3MuUkVQRUFUKTtcbiAgICByZXR1cm4gZWwub2Zmc2V0V2lkdGggLyBXaWR0aENhY2hlU2V0dGluZ3MuUkVQRUFUO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGlzRmlyZWZveCwgaXNMZWdhY3lFZGdlIH0gZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcblxuZXhwb3J0IGNvbnN0IElOVkVSVEVEX0RFRkFVTFRfQ09MT1IgPSAyNTc7XG5cbmV4cG9ydCBjb25zdCBESU1fT1BBQ0lUWSA9IDAuNTtcbi8vIFRoZSB0ZXh0IGJhc2VsaW5lIGlzIHNldCBjb25kaXRpb25hbGx5IGJ5IGJyb3dzZXIuIFVzaW5nICdpZGVvZ3JhcGhpYycgZm9yIEZpcmVmb3ggb3IgTGVnYWN5IEVkZ2Vcbi8vIHdvdWxkIHJlc3VsdCBpbiB0cnVuY2F0ZWQgdGV4dCAoSXNzdWUgMzM1MykuIFVzaW5nICdib3R0b20nIGZvciBDaHJvbWUgd291bGQgcmVzdWx0IGluIHNsaWdodGx5XG4vLyB1bmFsaWduZWQgUG93ZXJsaW5lIGZvbnRzIChQUiAzMzU2I2lzc3VlY29tbWVudC04NTA5MjgxNzkpLlxuZXhwb3J0IGNvbnN0IFRFWFRfQkFTRUxJTkU6IENhbnZhc1RleHRCYXNlbGluZSA9IGlzRmlyZWZveCB8fCBpc0xlZ2FjeUVkZ2UgPyAnYm90dG9tJyA6ICdpZGVvZ3JhcGhpYyc7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaW1lbnNpb25zLCBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHRocm93SWZGYWxzeTxUPih2YWx1ZTogVCB8IHVuZGVmaW5lZCB8IG51bGwpOiBUIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndmFsdWUgbXVzdCBub3QgYmUgZmFsc3knKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIE9ubHkgcmV0dXJuIHRydWUgZm9yIFBvd2VybGluZSBzeW1ib2xzIHdoaWNoIHJlcXVpcmVcbiAgLy8gZGlmZmVyZW50IHBhZGRpbmcgYW5kIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIG1pbmltdW0gY29udHJhc3RcbiAgLy8gcmF0aW8gc3RhbmRhcmRzXG4gIHJldHVybiAweEUwQTQgPD0gY29kZXBvaW50ICYmIGNvZGVwb2ludCA8PSAweEUwRDY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc3RyaWN0ZWRQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gMHhFMEIwIDw9IGNvZGVwb2ludCAmJiBjb2RlcG9pbnQgPD0gMHhFMEI3O1xufVxuXG5mdW5jdGlvbiBpc05lcmRGb250R2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4RTAwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4RjhGRjtcbn1cblxuZnVuY3Rpb24gaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIDB4MjUwMCA8PSBjb2RlcG9pbnQgJiYgY29kZXBvaW50IDw9IDB4MjU5Rjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1vamkoY29kZXBvaW50OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjYwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjY0RiB8fCAvLyBFbW90aWNvbnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjMwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjVGRiB8fCAvLyBNaXNjIFN5bWJvbHMgYW5kIFBpY3RvZ3JhcGhzXG4gICAgY29kZXBvaW50ID49IDB4MUY2ODAgJiYgY29kZXBvaW50IDw9IDB4MUY2RkYgfHwgLy8gVHJhbnNwb3J0IGFuZCBNYXBcbiAgICBjb2RlcG9pbnQgPj0gMHgyNjAwICAmJiBjb2RlcG9pbnQgPD0gMHgyNkZGICB8fCAvLyBNaXNjIHN5bWJvbHNcbiAgICBjb2RlcG9pbnQgPj0gMHgyNzAwICAmJiBjb2RlcG9pbnQgPD0gMHgyN0JGICB8fCAvLyBEaW5nYmF0c1xuICAgIGNvZGVwb2ludCA+PSAweEZFMDAgICYmIGNvZGVwb2ludCA8PSAweEZFMEYgIHx8IC8vIFZhcmlhdGlvbiBTZWxlY3RvcnNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjkwMCAmJiBjb2RlcG9pbnQgPD0gMHgxRjlGRiB8fCAvLyBTdXBwbGVtZW50YWwgU3ltYm9scyBhbmQgUGljdG9ncmFwaHNcbiAgICBjb2RlcG9pbnQgPj0gMHgxRjFFNiAmJiBjb2RlcG9pbnQgPD0gMHgxRjFGRlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dSZXNjYWxpbmcoY29kZXBvaW50OiBudW1iZXIgfCB1bmRlZmluZWQsIHdpZHRoOiBudW1iZXIsIGdseXBoU2l6ZVg6IG51bWJlciwgZGV2aWNlQ2VsbFdpZHRoOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAvLyBJcyBzaW5nbGUgY2VsbCB3aWR0aFxuICAgIHdpZHRoID09PSAxICYmXG4gICAgLy8gR2x5cGggZXhjZWVkcyBjZWxsIGJvdW5kcywgYWRkIDUwJSB0byBhdm9pZCBodXJ0aW5nIHJlYWRhYmlsaXR5IGJ5IHJlc2NhbGluZyBnbHlwaHMgdGhhdFxuICAgIC8vIGJhcmVseSBvdmVybGFwXG4gICAgZ2x5cGhTaXplWCA+IE1hdGguY2VpbChkZXZpY2VDZWxsV2lkdGggKiAxLjUpICYmXG4gICAgLy8gTmV2ZXIgcmVzY2FsZSBhc2NpaVxuICAgIGNvZGVwb2ludCAhPT0gdW5kZWZpbmVkICYmIGNvZGVwb2ludCA+IDB4RkYgJiZcbiAgICAvLyBOZXZlciByZXNjYWxlIGVtb2ppXG4gICAgIWlzRW1vamkoY29kZXBvaW50KSAmJlxuICAgIC8vIE5ldmVyIHJlc2NhbGUgcG93ZXJsaW5lIG9yIG5lcmQgZm9udHNcbiAgICAhaXNQb3dlcmxpbmVHbHlwaChjb2RlcG9pbnQpICYmICFpc05lcmRGb250R2x5cGgoY29kZXBvaW50KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJlYXRHbHlwaEFzQmFja2dyb3VuZENvbG9yKGNvZGVwb2ludDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Bvd2VybGluZUdseXBoKGNvZGVwb2ludCkgfHwgaXNCb3hPckJsb2NrR2x5cGgoY29kZXBvaW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmRlckRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIGNzczoge1xuICAgICAgY2FudmFzOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNlbGw6IGNyZWF0ZURpbWVuc2lvbigpXG4gICAgfSxcbiAgICBkZXZpY2U6IHtcbiAgICAgIGNhbnZhczogY3JlYXRlRGltZW5zaW9uKCksXG4gICAgICBjZWxsOiBjcmVhdGVEaW1lbnNpb24oKSxcbiAgICAgIGNoYXI6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgdG9wOiAwXG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaW1lbnNpb24oKTogSURpbWVuc2lvbnMge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU5leHRWYXJpYW50T2Zmc2V0KGNlbGxXaWR0aDogbnVtYmVyLCBsaW5lV2lkdGg6IG51bWJlciwgY3VycmVudE9mZnNldDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gIHJldHVybiAoY2VsbFdpZHRoIC0gKE1hdGgucm91bmQobGluZVdpZHRoKSAqIDIgLSBjdXJyZW50T2Zmc2V0KSkgJSAoTWF0aC5yb3VuZChsaW5lV2lkdGgpICogMik7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElUZXJtaW5hbCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSVNlbGVjdGlvblJlbmRlck1vZGVsIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5jbGFzcyBTZWxlY3Rpb25SZW5kZXJNb2RlbCBpbXBsZW1lbnRzIElTZWxlY3Rpb25SZW5kZXJNb2RlbCB7XG4gIHB1YmxpYyBoYXNTZWxlY3Rpb24hOiBib29sZWFuO1xuICBwdWJsaWMgY29sdW1uU2VsZWN0TW9kZSE6IGJvb2xlYW47XG4gIHB1YmxpYyB2aWV3cG9ydFN0YXJ0Um93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRFbmRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ITogbnVtYmVyO1xuICBwdWJsaWMgdmlld3BvcnRDYXBwZWRFbmRSb3chOiBudW1iZXI7XG4gIHB1YmxpYyBzdGFydENvbCE6IG51bWJlcjtcbiAgcHVibGljIGVuZENvbCE6IG51bWJlcjtcbiAgcHVibGljIHNlbGVjdGlvblN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgc2VsZWN0aW9uRW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmhhc1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuY29sdW1uU2VsZWN0TW9kZSA9IGZhbHNlO1xuICAgIHRoaXMudmlld3BvcnRTdGFydFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydEVuZFJvdyA9IDA7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gMDtcbiAgICB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93ID0gMDtcbiAgICB0aGlzLnN0YXJ0Q29sID0gMDtcbiAgICB0aGlzLmVuZENvbCA9IDA7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGUodGVybWluYWw6IElUZXJtaW5hbCwgc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgY29sdW1uU2VsZWN0TW9kZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gZW5kO1xuICAgIC8vIFNlbGVjdGlvbiBkb2VzIG5vdCBleGlzdFxuICAgIGlmICghc3RhcnQgfHwgIWVuZCB8fCAoc3RhcnRbMF0gPT09IGVuZFswXSAmJiBzdGFydFsxXSA9PT0gZW5kWzFdKSkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zbGF0ZSBmcm9tIGJ1ZmZlciBwb3NpdGlvbiB0byB2aWV3cG9ydCBwb3NpdGlvblxuICAgIGNvbnN0IHZpZXdwb3J0WSA9IHRlcm1pbmFsLmJ1ZmZlcnMuYWN0aXZlLnlkaXNwO1xuICAgIGNvbnN0IHZpZXdwb3J0U3RhcnRSb3cgPSBzdGFydFsxXSAtIHZpZXdwb3J0WTtcbiAgICBjb25zdCB2aWV3cG9ydEVuZFJvdyA9IGVuZFsxXSAtIHZpZXdwb3J0WTtcbiAgICBjb25zdCB2aWV3cG9ydENhcHBlZFN0YXJ0Um93ID0gTWF0aC5tYXgodmlld3BvcnRTdGFydFJvdywgMCk7XG4gICAgY29uc3Qgdmlld3BvcnRDYXBwZWRFbmRSb3cgPSBNYXRoLm1pbih2aWV3cG9ydEVuZFJvdywgdGVybWluYWwucm93cyAtIDEpO1xuXG4gICAgLy8gTm8gbmVlZCB0byBkcmF3IHRoZSBzZWxlY3Rpb25cbiAgICBpZiAodmlld3BvcnRDYXBwZWRTdGFydFJvdyA+PSB0ZXJtaW5hbC5yb3dzIHx8IHZpZXdwb3J0Q2FwcGVkRW5kUm93IDwgMCkge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaGFzU2VsZWN0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmNvbHVtblNlbGVjdE1vZGUgPSBjb2x1bW5TZWxlY3RNb2RlO1xuICAgIHRoaXMudmlld3BvcnRTdGFydFJvdyA9IHZpZXdwb3J0U3RhcnRSb3c7XG4gICAgdGhpcy52aWV3cG9ydEVuZFJvdyA9IHZpZXdwb3J0RW5kUm93O1xuICAgIHRoaXMudmlld3BvcnRDYXBwZWRTdGFydFJvdyA9IHZpZXdwb3J0Q2FwcGVkU3RhcnRSb3c7XG4gICAgdGhpcy52aWV3cG9ydENhcHBlZEVuZFJvdyA9IHZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgIHRoaXMuc3RhcnRDb2wgPSBzdGFydFswXTtcbiAgICB0aGlzLmVuZENvbCA9IGVuZFswXTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NlbGxTZWxlY3RlZCh0ZXJtaW5hbDogVGVybWluYWwsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmhhc1NlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB5IC09IHRlcm1pbmFsLmJ1ZmZlci5hY3RpdmUudmlld3BvcnRZO1xuICAgIGlmICh0aGlzLmNvbHVtblNlbGVjdE1vZGUpIHtcbiAgICAgIGlmICh0aGlzLnN0YXJ0Q29sIDw9IHRoaXMuZW5kQ29sKSB7XG4gICAgICAgIHJldHVybiB4ID49IHRoaXMuc3RhcnRDb2wgJiYgeSA+PSB0aGlzLnZpZXdwb3J0Q2FwcGVkU3RhcnRSb3cgJiZcbiAgICAgICAgICB4IDwgdGhpcy5lbmRDb2wgJiYgeSA8PSB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHggPCB0aGlzLnN0YXJ0Q29sICYmIHkgPj0gdGhpcy52aWV3cG9ydENhcHBlZFN0YXJ0Um93ICYmXG4gICAgICAgIHggPj0gdGhpcy5lbmRDb2wgJiYgeSA8PSB0aGlzLnZpZXdwb3J0Q2FwcGVkRW5kUm93O1xuICAgIH1cbiAgICByZXR1cm4gKHkgPiB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeSA8IHRoaXMudmlld3BvcnRFbmRSb3cpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93ID09PSB0aGlzLnZpZXdwb3J0RW5kUm93ICYmIHkgPT09IHRoaXMudmlld3BvcnRTdGFydFJvdyAmJiB4ID49IHRoaXMuc3RhcnRDb2wgJiYgeCA8IHRoaXMuZW5kQ29sKSB8fFxuICAgICAgKHRoaXMudmlld3BvcnRTdGFydFJvdyA8IHRoaXMudmlld3BvcnRFbmRSb3cgJiYgeSA9PT0gdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB4IDwgdGhpcy5lbmRDb2wpIHx8XG4gICAgICAodGhpcy52aWV3cG9ydFN0YXJ0Um93IDwgdGhpcy52aWV3cG9ydEVuZFJvdyAmJiB5ID09PSB0aGlzLnZpZXdwb3J0U3RhcnRSb3cgJiYgeCA+PSB0aGlzLnN0YXJ0Q29sKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwoKTogSVNlbGVjdGlvblJlbmRlck1vZGVsIHtcbiAgcmV0dXJuIG5ldyBTZWxlY3Rpb25SZW5kZXJNb2RlbCgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNlbGVjdGlvbiB3aXRoaW4gdGhlIGJ1ZmZlci4gVGhpcyBtb2RlbCBvbmx5IGNhcmVzIGFib3V0IGNvbHVtblxuICogYW5kIHJvdyBjb29yZGluYXRlcywgbm90IHdpZGUgY2hhcmFjdGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbk1vZGVsIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgc2VsZWN0IGFsbCBpcyBjdXJyZW50bHkgYWN0aXZlLlxuICAgKi9cbiAgcHVibGljIGlzU2VsZWN0QWxsQWN0aXZlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbWFsIGxlbmd0aCBvZiB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIHN0YXJ0IHBvc2l0aW9uLiBXaGVuIGRvdWJsZVxuICAgKiBjbGlja2luZyBvbiBhIHdvcmQsIHRoZSB3b3JkIHdpbGwgYmUgc2VsZWN0ZWQgd2hpY2ggbWFrZXMgdGhlIHNlbGVjdGlvblxuICAgKiBzdGFydCBhdCB0aGUgc3RhcnQgb2YgdGhlIHdvcmQgYW5kIG1ha2VzIHRoaXMgdmFyaWFibGUgdGhlIGxlbmd0aC5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydExlbmd0aDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIFt4LCB5XSBwb3NpdGlvbiB0aGUgc2VsZWN0aW9uIHN0YXJ0cyBhdC5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3Rpb25TdGFydDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIFt4LCB5XSBwb3NpdGlvbiB0aGUgc2VsZWN0aW9uIGVuZHMgYXQuXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0aW9uRW5kOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzU2VsZWN0QWxsQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydExlbmd0aCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZpbmFsIHNlbGVjdGlvbiBzdGFydCwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBzZWxlY3QgYWxsLlxuICAgKi9cbiAgcHVibGljIGdldCBmaW5hbFNlbGVjdGlvblN0YXJ0KCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0QWxsQWN0aXZlKSB7XG4gICAgICByZXR1cm4gWzAsIDBdO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3Rpb25FbmQgfHwgIXRoaXMuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkgPyB0aGlzLnNlbGVjdGlvbkVuZCA6IHRoaXMuc2VsZWN0aW9uU3RhcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZpbmFsIHNlbGVjdGlvbiBlbmQsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gc2VsZWN0IGFsbCwgZG91YmxlIGNsaWNrXG4gICAqIHdvcmQgc2VsZWN0aW9uIGFuZCB0cmlwbGUgY2xpY2sgbGluZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGZpbmFsU2VsZWN0aW9uRW5kKCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmlzU2VsZWN0QWxsQWN0aXZlKSB7XG4gICAgICByZXR1cm4gW3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgKyB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxXTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSBzZWxlY3Rpb24gc3RhcnQgKyBsZW5ndGggaWYgdGhlIGVuZCBkb2Vzbid0IGV4aXN0IG9yIHRoZXkncmUgcmV2ZXJzZWRcbiAgICBpZiAoIXRoaXMuc2VsZWN0aW9uRW5kIHx8IHRoaXMuYXJlU2VsZWN0aW9uVmFsdWVzUmV2ZXJzZWQoKSkge1xuICAgICAgY29uc3Qgc3RhcnRQbHVzTGVuZ3RoID0gdGhpcy5zZWxlY3Rpb25TdGFydFswXSArIHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGg7XG4gICAgICBpZiAoc3RhcnRQbHVzTGVuZ3RoID4gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgdHJhaWxpbmcgRU9MIGlzbid0IGluY2x1ZGVkIHdoZW4gdGhlIHNlbGVjdGlvbiBlbmRzIG9uIHRoZSByaWdodCBlZGdlXG4gICAgICAgIGlmIChzdGFydFBsdXNMZW5ndGggJSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gW3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSArIE1hdGguZmxvb3Ioc3RhcnRQbHVzTGVuZ3RoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc3RhcnRQbHVzTGVuZ3RoICUgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLnNlbGVjdGlvblN0YXJ0WzFdICsgTWF0aC5mbG9vcihzdGFydFBsdXNMZW5ndGggLyB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbc3RhcnRQbHVzTGVuZ3RoLCB0aGlzLnNlbGVjdGlvblN0YXJ0WzFdXTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIHRoZSB3b3JkL2xpbmUgaXMgc2VsZWN0ZWQgYWZ0ZXIgYSBkb3VibGUvdHJpcGxlIGNsaWNrXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGgpIHtcbiAgICAgIC8vIFNlbGVjdCB0aGUgbGFyZ2VyIG9mIHRoZSB0d28gd2hlbiBzdGFydCBhbmQgZW5kIGFyZSBvbiB0aGUgc2FtZSBsaW5lXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmRbMV0gPT09IHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0pIHtcbiAgICAgICAgLy8gS2VlcCB0aGUgd2hvbGUgd3JhcHBlZCB3b3JkL2xpbmUgc2VsZWN0ZWQgaWYgdGhlIGNvbnRlbnQgd3JhcHMgbXVsdGlwbGUgbGluZXNcbiAgICAgICAgY29uc3Qgc3RhcnRQbHVzTGVuZ3RoID0gdGhpcy5zZWxlY3Rpb25TdGFydFswXSArIHRoaXMuc2VsZWN0aW9uU3RhcnRMZW5ndGg7XG4gICAgICAgIGlmIChzdGFydFBsdXNMZW5ndGggPiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgICAgICByZXR1cm4gW3N0YXJ0UGx1c0xlbmd0aCAlIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSArIE1hdGguZmxvb3Ioc3RhcnRQbHVzTGVuZ3RoIC8gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtNYXRoLm1heChzdGFydFBsdXNMZW5ndGgsIHRoaXMuc2VsZWN0aW9uRW5kWzBdKSwgdGhpcy5zZWxlY3Rpb25FbmRbMV1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25FbmQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gc3RhcnQgYW5kIGVuZCBhcmUgcmV2ZXJzZWQuXG4gICAqL1xuICBwdWJsaWMgYXJlU2VsZWN0aW9uVmFsdWVzUmV2ZXJzZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuc2VsZWN0aW9uRW5kO1xuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRbMV0gPiBlbmRbMV0gfHwgKHN0YXJ0WzFdID09PSBlbmRbMV0gJiYgc3RhcnRbMF0gPiBlbmRbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB0aGUgYnVmZmVyIGJlaW5nIHRyaW1tZWQsIGFkanVzdCB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gYW1vdW50IFRoZSBhbW91bnQgdGhlIGJ1ZmZlciBpcyBiZWluZyB0cmltbWVkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGEgcmVmcmVzaCBpcyBuZWNlc3NhcnkuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlVHJpbShhbW91bnQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIEFkanVzdCB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIGJhc2VkIG9uIHRoZSB0cmltbWVkIGFtb3VudC5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSAtPSBhbW91bnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGlvbkVuZCkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25FbmRbMV0gLT0gYW1vdW50O1xuICAgIH1cblxuICAgIC8vIFRoZSBzZWxlY3Rpb24gaGFzIG1vdmVkIG9mZiB0aGUgYnVmZmVyLCBjbGVhciBpdC5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmQgJiYgdGhpcy5zZWxlY3Rpb25FbmRbMV0gPCAwKSB7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIHN0YXJ0IGlzIHRyaW1tZWQsIGVuc3VyZSB0aGUgc3RhcnQgY29sdW1uIGlzIDAuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgJiYgdGhpcy5zZWxlY3Rpb25TdGFydFsxXSA8IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRbMV0gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSUNoYXJTaXplU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuXG5leHBvcnQgY2xhc3MgQ2hhclNpemVTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElDaGFyU2l6ZVNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHdpZHRoOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9tZWFzdXJlU3RyYXRlZ3k6IElNZWFzdXJlU3RyYXRlZ3k7XG5cbiAgcHVibGljIGdldCBoYXNWYWxpZFNpemUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLndpZHRoID4gMCAmJiB0aGlzLmhlaWdodCA+IDA7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYXJTaXplQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25DaGFyU2l6ZUNoYW5nZSA9IHRoaXMuX29uQ2hhclNpemVDaGFuZ2UuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJT3B0aW9uc1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9tZWFzdXJlU3RyYXRlZ3kgPSB0aGlzLnJlZ2lzdGVyKG5ldyBUZXh0TWV0cmljc01lYXN1cmVTdHJhdGVneSh0aGlzLl9vcHRpb25zU2VydmljZSkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5fbWVhc3VyZVN0cmF0ZWd5ID0gdGhpcy5yZWdpc3RlcihuZXcgRG9tTWVhc3VyZVN0cmF0ZWd5KGRvY3VtZW50LCBwYXJlbnRFbGVtZW50LCB0aGlzLl9vcHRpb25zU2VydmljZSkpO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9uTXVsdGlwbGVPcHRpb25DaGFuZ2UoWydmb250RmFtaWx5JywgJ2ZvbnRTaXplJ10sICgpID0+IHRoaXMubWVhc3VyZSgpKSk7XG4gIH1cblxuICBwdWJsaWMgbWVhc3VyZSgpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9tZWFzdXJlU3RyYXRlZ3kubWVhc3VyZSgpO1xuICAgIGlmIChyZXN1bHQud2lkdGggIT09IHRoaXMud2lkdGggfHwgcmVzdWx0LmhlaWdodCAhPT0gdGhpcy5oZWlnaHQpIHtcbiAgICAgIHRoaXMud2lkdGggPSByZXN1bHQud2lkdGg7XG4gICAgICB0aGlzLmhlaWdodCA9IHJlc3VsdC5oZWlnaHQ7XG4gICAgICB0aGlzLl9vbkNoYXJTaXplQ2hhbmdlLmZpcmUoKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIElNZWFzdXJlU3RyYXRlZ3kge1xuICBtZWFzdXJlKCk6IFJlYWRvbmx5PElNZWFzdXJlUmVzdWx0Pjtcbn1cblxuaW50ZXJmYWNlIElNZWFzdXJlUmVzdWx0IHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmNvbnN0IGVudW0gRG9tTWVhc3VyZVN0cmF0ZWd5Q29uc3RhbnRzIHtcbiAgUkVQRUFUID0gMzJcbn1cblxuYWJzdHJhY3QgY2xhc3MgQmFzZU1lYXN1cmVTdGF0ZWd5IGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElNZWFzdXJlU3RyYXRlZ3kge1xuICBwcm90ZWN0ZWQgX3Jlc3VsdDogSU1lYXN1cmVSZXN1bHQgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcblxuICBwcm90ZWN0ZWQgX3ZhbGlkYXRlQW5kU2V0KHdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQsIGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gSWYgdmFsdWVzIGFyZSAwIHRoZW4gdGhlIGVsZW1lbnQgaXMgbGlrZWx5IGN1cnJlbnRseSBkaXNwbGF5Om5vbmUsIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkXG4gICAgLy8gcmV0YWluIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgaGVpZ2h0ID4gMCkge1xuICAgICAgdGhpcy5fcmVzdWx0LndpZHRoID0gd2lkdGg7XG4gICAgICB0aGlzLl9yZXN1bHQuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBtZWFzdXJlKCk6IFJlYWRvbmx5PElNZWFzdXJlUmVzdWx0Pjtcbn1cblxuY2xhc3MgRG9tTWVhc3VyZVN0cmF0ZWd5IGV4dGVuZHMgQmFzZU1lYXN1cmVTdGF0ZWd5IHtcbiAgcHJpdmF0ZSBfbWVhc3VyZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIF9wYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgneHRlcm0tY2hhci1tZWFzdXJlLWVsZW1lbnQnKTtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC50ZXh0Q29udGVudCA9ICdXJy5yZXBlYXQoRG9tTWVhc3VyZVN0cmF0ZWd5Q29uc3RhbnRzLlJFUEVBVCk7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQuc3R5bGUud2hpdGVTcGFjZSA9ICdwcmUnO1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLmZvbnRLZXJuaW5nID0gJ25vbmUnO1xuICAgIHRoaXMuX3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbWVhc3VyZUVsZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIG1lYXN1cmUoKTogUmVhZG9ubHk8SU1lYXN1cmVSZXN1bHQ+IHtcbiAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5mb250RmFtaWx5ID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250RmFtaWx5O1xuICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLmZvbnRTaXplID0gYCR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZX1weGA7XG5cbiAgICAvLyBOb3RlIHRoYXQgdGhpcyB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIGxheW91dFxuICAgIHRoaXMuX3ZhbGlkYXRlQW5kU2V0KE51bWJlcih0aGlzLl9tZWFzdXJlRWxlbWVudC5vZmZzZXRXaWR0aCkgLyBEb21NZWFzdXJlU3RyYXRlZ3lDb25zdGFudHMuUkVQRUFULCBOdW1iZXIodGhpcy5fbWVhc3VyZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0O1xuICB9XG59XG5cbmNsYXNzIFRleHRNZXRyaWNzTWVhc3VyZVN0cmF0ZWd5IGV4dGVuZHMgQmFzZU1lYXN1cmVTdGF0ZWd5IHtcbiAgcHJpdmF0ZSBfY2FudmFzOiBPZmZzY3JlZW5DYW52YXM7XG4gIHByaXZhdGUgX2N0eDogT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgYW55IHJlcXVpcmVkIEFQSSBpcyBub3Qgc3VwcG9ydGVkXG4gICAgdGhpcy5fY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcygxMDAsIDEwMCk7XG4gICAgdGhpcy5fY3R4ID0gdGhpcy5fY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuICAgIGNvbnN0IGEgPSB0aGlzLl9jdHgubWVhc3VyZVRleHQoJ1cnKTtcbiAgICBpZiAoISgnd2lkdGgnIGluIGEgJiYgJ2ZvbnRCb3VuZGluZ0JveEFzY2VudCcgaW4gYSAmJiAnZm9udEJvdW5kaW5nQm94RGVzY2VudCcgaW4gYSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgZm9udCBtZXRyaWNzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWVhc3VyZSgpOiBSZWFkb25seTxJTWVhc3VyZVJlc3VsdD4ge1xuICAgIHRoaXMuX2N0eC5mb250ID0gYCR7dGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5mb250U2l6ZX1weCAke3RoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuZm9udEZhbWlseX1gO1xuICAgIGNvbnN0IG1ldHJpY3MgPSB0aGlzLl9jdHgubWVhc3VyZVRleHQoJ1cnKTtcbiAgICB0aGlzLl92YWxpZGF0ZUFuZFNldChtZXRyaWNzLndpZHRoLCBtZXRyaWNzLmZvbnRCb3VuZGluZ0JveEFzY2VudCArIG1ldHJpY3MuZm9udEJvdW5kaW5nQm94RGVzY2VudCk7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyTGluZSwgSUNlbGxEYXRhLCBDaGFyRGF0YSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBJQ2hhcmFjdGVySm9pbmVyIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9BdHRyaWJ1dGVEYXRhJztcbmltcG9ydCB7IFdISVRFU1BBQ0VfQ0VMTF9DSEFSLCBDb250ZW50IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlIH0gZnJvbSAnYnJvd3Nlci9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBjbGFzcyBKb2luZWRDZWxsRGF0YSBleHRlbmRzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQ2VsbERhdGEge1xuICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xuICAvLyAuY29udGVudCBjYXJyaWVzIG5vIG1lYW5pbmcgZm9yIGpvaW5lZCBDZWxsRGF0YSwgc2ltcGx5IG51bGxpZnkgaXRcbiAgLy8gdGh1cyB3ZSBoYXZlIHRvIG92ZXJsb2FkIGFsbCBvdGhlciAuY29udGVudCBhY2Nlc3NvcnNcbiAgcHVibGljIGNvbnRlbnQ6IG51bWJlciA9IDA7XG4gIHB1YmxpYyBmZzogbnVtYmVyO1xuICBwdWJsaWMgYmc6IG51bWJlcjtcbiAgcHVibGljIGNvbWJpbmVkRGF0YTogc3RyaW5nID0gJyc7XG5cbiAgY29uc3RydWN0b3IoZmlyc3RDZWxsOiBJQ2VsbERhdGEsIGNoYXJzOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZmcgPSBmaXJzdENlbGwuZmc7XG4gICAgdGhpcy5iZyA9IGZpcnN0Q2VsbC5iZztcbiAgICB0aGlzLmNvbWJpbmVkRGF0YSA9IGNoYXJzO1xuICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XG4gIH1cblxuICBwdWJsaWMgaXNDb21iaW5lZCgpOiBudW1iZXIge1xuICAgIC8vIGFsd2F5cyBtYXJrIGpvaW5lZCBjZWxsIGRhdGEgYXMgY29tYmluZWRcbiAgICByZXR1cm4gQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG5cbiAgcHVibGljIGdldFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoO1xuICB9XG5cbiAgcHVibGljIGdldENoYXJzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tYmluZWREYXRhO1xuICB9XG5cbiAgcHVibGljIGdldENvZGUoKTogbnVtYmVyIHtcbiAgICAvLyBjb2RlIGFsd2F5cyBnZXRzIHRoZSBoaWdoZXN0IHBvc3NpYmxlIGZha2UgY29kZXBvaW50IChyZWFkIGFzIC0xKVxuICAgIC8vIHRoaXMgaXMgbmVlZGVkIGFzIGNvZGUgaXMgdXNlZCBieSBjYWNoZXMgYXMgaWRlbnRpZmllclxuICAgIHJldHVybiAweDFGRkZGRjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGcm9tQ2hhckRhdGEodmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBc0NoYXJEYXRhKCk6IENoYXJEYXRhIHtcbiAgICByZXR1cm4gW3RoaXMuZmcsIHRoaXMuZ2V0Q2hhcnMoKSwgdGhpcy5nZXRXaWR0aCgpLCB0aGlzLmdldENvZGUoKV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENoYXJhY3RlckpvaW5lclNlcnZpY2UgaW1wbGVtZW50cyBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9jaGFyYWN0ZXJKb2luZXJzOiBJQ2hhcmFjdGVySm9pbmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBfbmV4dENoYXJhY3RlckpvaW5lcklkOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF93b3JrQ2VsbDogQ2VsbERhdGEgPSBuZXcgQ2VsbERhdGEoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7IH1cblxuICBwdWJsaWMgcmVnaXN0ZXIoaGFuZGxlcjogKHRleHQ6IHN0cmluZykgPT4gW251bWJlciwgbnVtYmVyXVtdKTogbnVtYmVyIHtcbiAgICBjb25zdCBqb2luZXI6IElDaGFyYWN0ZXJKb2luZXIgPSB7XG4gICAgICBpZDogdGhpcy5fbmV4dENoYXJhY3RlckpvaW5lcklkKyssXG4gICAgICBoYW5kbGVyXG4gICAgfTtcblxuICAgIHRoaXMuX2NoYXJhY3RlckpvaW5lcnMucHVzaChqb2luZXIpO1xuICAgIHJldHVybiBqb2luZXIuaWQ7XG4gIH1cblxuICBwdWJsaWMgZGVyZWdpc3Rlcihqb2luZXJJZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fY2hhcmFjdGVySm9pbmVyc1tpXS5pZCA9PT0gam9pbmVySWQpIHtcbiAgICAgICAgdGhpcy5fY2hhcmFjdGVySm9pbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRKb2luZWRDaGFyYWN0ZXJzKHJvdzogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXVtdIHtcbiAgICBpZiAodGhpcy5fY2hhcmFjdGVySm9pbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgaWYgKCFsaW5lIHx8IGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICBjb25zdCBsaW5lU3RyID0gbGluZS50cmFuc2xhdGVUb1N0cmluZyh0cnVlKTtcblxuICAgIC8vIEJlY2F1c2Ugc29tZSBjZWxscyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbXVsdGlwbGUgamF2YXNjcmlwdCBjaGFyYWN0ZXJzLFxuICAgIC8vIHdlIHRyYWNrIHRoZSBjZWxsIGFuZCB0aGUgc3RyaW5nIGluZGV4ZXMgc2VwYXJhdGVseS4gVGhpcyBhbGxvd3MgdXMgdG9cbiAgICAvLyB0cmFuc2xhdGUgdGhlIHN0cmluZyByYW5nZXMgd2UgZ2V0IGZyb20gdGhlIGpvaW5lcnMgYmFjayBpbnRvIGNlbGwgcmFuZ2VzXG4gICAgLy8gZm9yIHVzZSB3aGVuIHJlbmRlcmluZ1xuICAgIGxldCByYW5nZVN0YXJ0Q29sdW1uID0gMDtcbiAgICBsZXQgY3VycmVudFN0cmluZ0luZGV4ID0gMDtcbiAgICBsZXQgcmFuZ2VTdGFydFN0cmluZ0luZGV4ID0gMDtcbiAgICBsZXQgcmFuZ2VBdHRyRkcgPSBsaW5lLmdldEZnKDApO1xuICAgIGxldCByYW5nZUF0dHJCRyA9IGxpbmUuZ2V0QmcoMCk7XG5cbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGxpbmUuZ2V0VHJpbW1lZExlbmd0aCgpOyB4KyspIHtcbiAgICAgIGxpbmUubG9hZENlbGwoeCwgdGhpcy5fd29ya0NlbGwpO1xuXG4gICAgICBpZiAodGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgICAvLyBJZiB0aGlzIGNoYXJhY3RlciBpcyBvZiB3aWR0aCAwLCBza2lwIGl0LlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5kIG9mIHJhbmdlXG4gICAgICBpZiAodGhpcy5fd29ya0NlbGwuZmcgIT09IHJhbmdlQXR0ckZHIHx8IHRoaXMuX3dvcmtDZWxsLmJnICE9PSByYW5nZUF0dHJCRykge1xuICAgICAgICAvLyBJZiB3ZSBlbmRlZCB1cCB3aXRoIGEgc2VxdWVuY2Ugb2YgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIsXG4gICAgICAgIC8vIGxvb2sgZm9yIHJhbmdlcyB0byBqb2luLlxuICAgICAgICBpZiAoeCAtIHJhbmdlU3RhcnRDb2x1bW4gPiAxKSB7XG4gICAgICAgICAgY29uc3Qgam9pbmVkUmFuZ2VzID0gdGhpcy5fZ2V0Sm9pbmVkUmFuZ2VzKFxuICAgICAgICAgICAgbGluZVN0cixcbiAgICAgICAgICAgIHJhbmdlU3RhcnRTdHJpbmdJbmRleCxcbiAgICAgICAgICAgIGN1cnJlbnRTdHJpbmdJbmRleCxcbiAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICByYW5nZVN0YXJ0Q29sdW1uXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpvaW5lZFJhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmFuZ2VzLnB1c2goam9pbmVkUmFuZ2VzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBvdXIgbWFya2VycyBmb3IgYSBuZXcgcmFuZ2UuXG4gICAgICAgIHJhbmdlU3RhcnRDb2x1bW4gPSB4O1xuICAgICAgICByYW5nZVN0YXJ0U3RyaW5nSW5kZXggPSBjdXJyZW50U3RyaW5nSW5kZXg7XG4gICAgICAgIHJhbmdlQXR0ckZHID0gdGhpcy5fd29ya0NlbGwuZmc7XG4gICAgICAgIHJhbmdlQXR0ckJHID0gdGhpcy5fd29ya0NlbGwuYmc7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRTdHJpbmdJbmRleCArPSB0aGlzLl93b3JrQ2VsbC5nZXRDaGFycygpLmxlbmd0aCB8fCBXSElURVNQQUNFX0NFTExfQ0hBUi5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBhbnkgdHJhaWxpbmcgcmFuZ2VzLlxuICAgIGlmICh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSByYW5nZVN0YXJ0Q29sdW1uID4gMSkge1xuICAgICAgY29uc3Qgam9pbmVkUmFuZ2VzID0gdGhpcy5fZ2V0Sm9pbmVkUmFuZ2VzKFxuICAgICAgICBsaW5lU3RyLFxuICAgICAgICByYW5nZVN0YXJ0U3RyaW5nSW5kZXgsXG4gICAgICAgIGN1cnJlbnRTdHJpbmdJbmRleCxcbiAgICAgICAgbGluZSxcbiAgICAgICAgcmFuZ2VTdGFydENvbHVtblxuICAgICAgKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgam9pbmVkUmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKGpvaW5lZFJhbmdlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIHNlZ21lbnQgb2YgYSBsaW5lIG9mIHRleHQsIGZpbmQgYWxsIHJhbmdlcyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlXG4gICAqIGpvaW5lZCBpbiBhIHNpbmdsZSByZW5kZXJpbmcgdW5pdC4gUmFuZ2VzIGFyZSBpbnRlcm5hbGx5IGNvbnZlcnRlZCB0b1xuICAgKiBjb2x1bW4gcmFuZ2VzLCByYXRoZXIgdGhhbiBzdHJpbmcgcmFuZ2VzLlxuICAgKiBAcGFyYW0gbGluZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZ1bGwgbGluZSBvZiB0ZXh0XG4gICAqIEBwYXJhbSBzdGFydEluZGV4IFN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByYW5nZSB0byBzZWFyY2ggaW4gdGhlIHN0cmluZyAoaW5jbHVzaXZlKVxuICAgKiBAcGFyYW0gZW5kSW5kZXggRW5kIHBvc2l0aW9uIG9mIHRoZSByYW5nZSB0byBzZWFyY2ggaW4gdGhlIHN0cmluZyAoZXhjbHVzaXZlKVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Sm9pbmVkUmFuZ2VzKGxpbmU6IHN0cmluZywgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBsaW5lRGF0YTogSUJ1ZmZlckxpbmUsIHN0YXJ0Q29sOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdW10ge1xuICAgIGNvbnN0IHRleHQgPSBsaW5lLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhbHJlYWR5IGtub3cgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgam9pbmVyIHNvXG4gICAgLy8gd2UgY2FuIGp1c3QgcHVsbCBpdHMgdmFsdWUgYW5kIGFzc2lnbiBpdCBkaXJlY3RseSByYXRoZXIgdGhhblxuICAgIC8vIG1lcmdpbmcgaXQgaW50byBhbiBlbXB0eSBhcnJheSwgd2hpY2ggaW5jdXJzIHVubmVjZXNzYXJ5IHdyaXRlcy5cbiAgICBsZXQgYWxsSm9pbmVkUmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgYWxsSm9pbmVkUmFuZ2VzID0gdGhpcy5fY2hhcmFjdGVySm9pbmVyc1swXS5oYW5kbGVyKHRleHQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl9jaGFyYWN0ZXJKb2luZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBXZSBtZXJnZSBhbnkgb3ZlcmxhcHBpbmcgcmFuZ2VzIGFjcm9zcyB0aGUgZGlmZmVyZW50IGpvaW5lcnNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGpvaW5lclJhbmdlcyA9IHRoaXMuX2NoYXJhY3RlckpvaW5lcnNbaV0uaGFuZGxlcih0ZXh0KTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBqb2luZXJSYW5nZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICBDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlLl9tZXJnZVJhbmdlcyhhbGxKb2luZWRSYW5nZXMsIGpvaW5lclJhbmdlc1tqXSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdHJpbmdSYW5nZXNUb0NlbGxSYW5nZXMoYWxsSm9pbmVkUmFuZ2VzLCBsaW5lRGF0YSwgc3RhcnRDb2wpO1xuICAgIHJldHVybiBhbGxKb2luZWRSYW5nZXM7XG4gIH1cblxuICAvKipcbiAgICogTW9kaWZpZXMgdGhlIHByb3ZpZGVkIHJhbmdlcyBpbi1wbGFjZSB0byBhZGp1c3QgZm9yIHZhcmlhdGlvbnMgYmV0d2VlblxuICAgKiBzdHJpbmcgbGVuZ3RoIGFuZCBjZWxsIHdpZHRoIHNvIHRoYXQgdGhlIHJhbmdlIHJlcHJlc2VudHMgYSBjZWxsIHJhbmdlLFxuICAgKiByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHJhbmdlIHRoZSBqb2luZXIgcHJvdmlkZXMuXG4gICAqIEBwYXJhbSByYW5nZXMgU3RyaW5nIHJhbmdlcyBjb250YWluaW5nIHN0YXJ0IChpbmNsdXNpdmUpIGFuZCBlbmQgKGV4Y2x1c2l2ZSkgaW5kZXhcbiAgICogQHBhcmFtIGxpbmUgQ2VsbCBkYXRhIGZvciB0aGUgcmVsZXZhbnQgbGluZSBpbiB0aGUgdGVybWluYWxcbiAgICogQHBhcmFtIHN0YXJ0Q29sIE9mZnNldCB3aXRoaW4gdGhlIGxpbmUgdG8gc3RhcnQgZnJvbVxuICAgKi9cbiAgcHJpdmF0ZSBfc3RyaW5nUmFuZ2VzVG9DZWxsUmFuZ2VzKHJhbmdlczogW251bWJlciwgbnVtYmVyXVtdLCBsaW5lOiBJQnVmZmVyTGluZSwgc3RhcnRDb2w6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBjdXJyZW50UmFuZ2VJbmRleCA9IDA7XG4gICAgbGV0IGN1cnJlbnRSYW5nZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICBsZXQgY3VycmVudFN0cmluZ0luZGV4ID0gMDtcbiAgICBsZXQgY3VycmVudFJhbmdlID0gcmFuZ2VzW2N1cnJlbnRSYW5nZUluZGV4XTtcblxuICAgIC8vIElmIHdlIGdvdCB0aHJvdWdoIGFsbCBvZiB0aGUgcmFuZ2VzLCBzdG9wIHNlYXJjaGluZ1xuICAgIGlmICghY3VycmVudFJhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgeCA9IHN0YXJ0Q29sOyB4IDwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzOyB4KyspIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gbGluZS5nZXRXaWR0aCh4KTtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IGxpbmUuZ2V0U3RyaW5nKHgpLmxlbmd0aCB8fCBXSElURVNQQUNFX0NFTExfQ0hBUi5sZW5ndGg7XG5cbiAgICAgIC8vIFdlIHNraXAgemVyby13aWR0aCBjaGFyYWN0ZXJzIHdoZW4gY3JlYXRpbmcgdGhlIHN0cmluZyB0byBqb2luIHRoZSB0ZXh0XG4gICAgICAvLyBzbyB3ZSBkbyB0aGUgc2FtZSBoZXJlXG4gICAgICBpZiAod2lkdGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkanVzdCB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlXG4gICAgICBpZiAoIWN1cnJlbnRSYW5nZVN0YXJ0ZWQgJiYgY3VycmVudFJhbmdlWzBdIDw9IGN1cnJlbnRTdHJpbmdJbmRleCkge1xuICAgICAgICBjdXJyZW50UmFuZ2VbMF0gPSB4O1xuICAgICAgICBjdXJyZW50UmFuZ2VTdGFydGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHRoZSBlbmQgb2YgdGhlIHJhbmdlXG4gICAgICBpZiAoY3VycmVudFJhbmdlWzFdIDw9IGN1cnJlbnRTdHJpbmdJbmRleCkge1xuICAgICAgICBjdXJyZW50UmFuZ2VbMV0gPSB4O1xuXG4gICAgICAgIC8vIFdlJ3JlIGZpbmlzaGVkIHdpdGggdGhpcyByYW5nZSwgc28gd2UgbW92ZSB0byB0aGUgbmV4dCBvbmVcbiAgICAgICAgY3VycmVudFJhbmdlID0gcmFuZ2VzWysrY3VycmVudFJhbmdlSW5kZXhdO1xuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtb3JlIHJhbmdlcyBsZWZ0LCBzdG9wIHNlYXJjaGluZ1xuICAgICAgICBpZiAoIWN1cnJlbnRSYW5nZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmFuZ2VzIGNhbiBiZSBvbiBhZGphY2VudCBjaGFyYWN0ZXJzLiBCZWNhdXNlIHRoZSBlbmQgaW5kZXggb2YgdGhlXG4gICAgICAgIC8vIHJhbmdlcyBhcmUgZXhjbHVzaXZlLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGluZGV4IGZvciB0aGUgc3RhcnQgb2YgYVxuICAgICAgICAvLyByYW5nZSBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIGVuZCBpbmRleCBvZiB0aGUgcHJldmlvdXMgcmFuZ2UuIFRvXG4gICAgICAgIC8vIGFjY291bnQgZm9yIHRoZSBzdGFydCBvZiB0aGUgbmV4dCByYW5nZSwgd2UgY2hlY2sgaGVyZSBqdXN0IGluIGNhc2UuXG4gICAgICAgIGlmIChjdXJyZW50UmFuZ2VbMF0gPD0gY3VycmVudFN0cmluZ0luZGV4KSB7XG4gICAgICAgICAgY3VycmVudFJhbmdlWzBdID0geDtcbiAgICAgICAgICBjdXJyZW50UmFuZ2VTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50UmFuZ2VTdGFydGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHRoZSBzdHJpbmcgaW5kZXggYmFzZWQgb24gdGhlIGNoYXJhY3RlciBsZW5ndGggdG8gbGluZSB1cCB3aXRoXG4gICAgICAvLyB0aGUgY29sdW1uIGFkanVzdG1lbnRcbiAgICAgIGN1cnJlbnRTdHJpbmdJbmRleCArPSBsZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYSByYW5nZSBsZWZ0IGF0IHRoZSBlbmQsIGl0IG11c3QgZXh0ZW5kIGFsbCB0aGUgd2F5IHRvXG4gICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZS5cbiAgICBpZiAoY3VycmVudFJhbmdlKSB7XG4gICAgICBjdXJyZW50UmFuZ2VbMV0gPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlcyB0aGUgcmFuZ2UgZGVmaW5lZCBieSB0aGUgcHJvdmlkZWQgc3RhcnQgYW5kIGVuZCBpbnRvIHRoZSBsaXN0IG9mXG4gICAqIGV4aXN0aW5nIHJhbmdlcy4gVGhlIG1lcmdlIGlzIGRvbmUgaW4gcGxhY2Ugb24gdGhlIGV4aXN0aW5nIHJhbmdlIGZvclxuICAgKiBwZXJmb3JtYW5jZSBhbmQgaXMgYWxzbyByZXR1cm5lZC5cbiAgICogQHBhcmFtIHJhbmdlcyBFeGlzdGluZyByYW5nZSBsaXN0XG4gICAqIEBwYXJhbSBuZXdSYW5nZSBUdXBsZSBvZiB0d28gbnVtYmVycyByZXByZXNlbnRpbmcgdGhlIG5ldyByYW5nZSB0byBtZXJnZSBpbi5cbiAgICogQHJldHVybnMgVGhlIHJhbmdlcyBpbnB1dCB3aXRoIHRoZSBuZXcgcmFuZ2UgbWVyZ2VkIGluIHBsYWNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfbWVyZ2VSYW5nZXMocmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW10sIG5ld1JhbmdlOiBbbnVtYmVyLCBudW1iZXJdKTogW251bWJlciwgbnVtYmVyXVtdIHtcbiAgICBsZXQgaW5SYW5nZSA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHJhbmdlc1tpXTtcbiAgICAgIGlmICghaW5SYW5nZSkge1xuICAgICAgICBpZiAobmV3UmFuZ2VbMV0gPD0gcmFuZ2VbMF0pIHtcbiAgICAgICAgICAvLyBDYXNlIDE6IE5ldyByYW5nZSBpcyBiZWZvcmUgdGhlIHNlYXJjaCByYW5nZVxuICAgICAgICAgIHJhbmdlcy5zcGxpY2UoaSwgMCwgbmV3UmFuZ2UpO1xuICAgICAgICAgIHJldHVybiByYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UmFuZ2VbMV0gPD0gcmFuZ2VbMV0pIHtcbiAgICAgICAgICAvLyBDYXNlIDI6IE5ldyByYW5nZSBpcyBlaXRoZXIgd2hvbGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlXG4gICAgICAgICAgLy8gc2VhcmNoIHJhbmdlIG9yIG92ZXJsYXBzIHdpdGggdGhlIGZyb250IG9mIGl0XG4gICAgICAgICAgcmFuZ2VbMF0gPSBNYXRoLm1pbihuZXdSYW5nZVswXSwgcmFuZ2VbMF0pO1xuICAgICAgICAgIHJldHVybiByYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UmFuZ2VbMF0gPCByYW5nZVsxXSkge1xuICAgICAgICAgIC8vIENhc2UgMzogTmV3IHJhbmdlIGVpdGhlciB3aG9sbHkgY29udGFpbnMgdGhlIHNlYXJjaCByYW5nZVxuICAgICAgICAgIC8vIG9yIG92ZXJsYXBzIHdpdGggdGhlIGVuZCBvZiBpdFxuICAgICAgICAgIHJhbmdlWzBdID0gTWF0aC5taW4obmV3UmFuZ2VbMF0sIHJhbmdlWzBdKTtcbiAgICAgICAgICBpblJhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhc2UgNDogTmV3IHJhbmdlIHN0YXJ0cyBhZnRlciB0aGUgc2VhcmNoIHJhbmdlXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5ld1JhbmdlWzFdIDw9IHJhbmdlWzBdKSB7XG4gICAgICAgICAgLy8gQ2FzZSA1OiBOZXcgcmFuZ2UgZXh0ZW5kcyBmcm9tIHByZXZpb3VzIHJhbmdlIGJ1dCBkb2Vzbid0XG4gICAgICAgICAgLy8gcmVhY2ggdGhlIGN1cnJlbnQgb25lXG4gICAgICAgICAgcmFuZ2VzW2kgLSAxXVsxXSA9IG5ld1JhbmdlWzFdO1xuICAgICAgICAgIHJldHVybiByYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV3UmFuZ2VbMV0gPD0gcmFuZ2VbMV0pIHtcbiAgICAgICAgICAvLyBDYXNlIDY6IE5ldyByYW5nZSBleHRlbmRzIGZyb20gcHJ2aW91cyByYW5nZSBpbnRvIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgcmFuZ2VcbiAgICAgICAgICByYW5nZXNbaSAtIDFdWzFdID0gTWF0aC5tYXgobmV3UmFuZ2VbMV0sIHJhbmdlWzFdKTtcbiAgICAgICAgICByYW5nZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIHJldHVybiByYW5nZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYXNlIDc6IE5ldyByYW5nZSBleHRlbmRzIGZyb20gcHJldmlvdXMgcmFuZ2UgcGFzdCB0aGVcbiAgICAgICAgLy8gZW5kIG9mIHRoZSBjdXJyZW50IHJhbmdlXG4gICAgICAgIHJhbmdlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5SYW5nZSkge1xuICAgICAgLy8gQ2FzZSA4OiBOZXcgcmFuZ2UgZXh0ZW5kcyBwYXN0IHRoZSBsYXN0IGV4aXN0aW5nIHJhbmdlXG4gICAgICByYW5nZXNbcmFuZ2VzLmxlbmd0aCAtIDFdWzFdID0gbmV3UmFuZ2VbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhc2UgOTogTmV3IHJhbmdlIHN0YXJ0cyBhZnRlciB0aGUgbGFzdCBleGlzdGluZyByYW5nZVxuICAgICAgcmFuZ2VzLnB1c2gobmV3UmFuZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiByYW5nZXM7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSwgTXV0YWJsZURpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSUNvcmVCcm93c2VyU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBmb3J3YXJkRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciB9IGZyb20gJ2Jyb3dzZXIvTGlmZWN5Y2xlJztcblxuZXhwb3J0IGNsYXNzIENvcmVCcm93c2VyU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ29yZUJyb3dzZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2lzRm9jdXNlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9jYWNoZWRJc0ZvY3VzZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3NjcmVlbkRwck1vbml0b3IgPSBuZXcgU2NyZWVuRHByTW9uaXRvcih0aGlzLl93aW5kb3cpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRHByQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRwckNoYW5nZSA9IHRoaXMuX29uRHByQ2hhbmdlLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbldpbmRvd0NoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbldpbmRvd0NoYW5nZSA9IHRoaXMuX29uV2luZG93Q2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3RleHRhcmVhOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICAgIHByaXZhdGUgX3dpbmRvdzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMsXG4gICAgcHVibGljIHJlYWRvbmx5IG1haW5Eb2N1bWVudDogRG9jdW1lbnRcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIE1vbml0b3IgZGV2aWNlIHBpeGVsIHJhdGlvXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLm9uV2luZG93Q2hhbmdlKHcgPT4gdGhpcy5fc2NyZWVuRHByTW9uaXRvci5zZXRXaW5kb3codykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl9zY3JlZW5EcHJNb25pdG9yLm9uRHByQ2hhbmdlLCB0aGlzLl9vbkRwckNoYW5nZSkpO1xuXG4gICAgdGhpcy5fdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB0aGlzLl9pc0ZvY3VzZWQgPSB0cnVlKTtcbiAgICB0aGlzLl90ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgKCkgPT4gdGhpcy5faXNGb2N1c2VkID0gZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGdldCB3aW5kb3coKTogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMge1xuICAgIHJldHVybiB0aGlzLl93aW5kb3c7XG4gIH1cblxuICBwdWJsaWMgc2V0IHdpbmRvdyh2YWx1ZTogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMpIHtcbiAgICBpZiAodGhpcy5fd2luZG93ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fd2luZG93ID0gdmFsdWU7XG4gICAgICB0aGlzLl9vbldpbmRvd0NoYW5nZS5maXJlKHRoaXMuX3dpbmRvdyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBkcHIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGb2N1c2VkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9jYWNoZWRJc0ZvY3VzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fY2FjaGVkSXNGb2N1c2VkID0gdGhpcy5faXNGb2N1c2VkICYmIHRoaXMuX3RleHRhcmVhLm93bmVyRG9jdW1lbnQuaGFzRm9jdXMoKTtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX2NhY2hlZElzRm9jdXNlZCA9IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jYWNoZWRJc0ZvY3VzZWQ7XG4gIH1cbn1cblxuXG4vKipcbiAqIFRoZSBzY3JlZW4gZGV2aWNlIHBpeGVsIHJhdGlvIG1vbml0b3IgYWxsb3dzIGxpc3RlbmluZyBmb3Igd2hlbiB0aGVcbiAqIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHZhbHVlIGNoYW5nZXMuIFRoaXMgaXMgZG9uZSBub3Qgd2l0aCBwb2xsaW5nIGJ1dCB3aXRoXG4gKiB0aGUgdXNlIG9mIHdpbmRvdy5tYXRjaE1lZGlhIHRvIHdhdGNoIG1lZGlhIHF1ZXJpZXMuIFdoZW4gdGhlIGV2ZW50IGZpcmVzLFxuICogdGhlIGxpc3RlbmVyIHdpbGwgYmUgcmVhdHRhY2hlZCB1c2luZyBhIGRpZmZlcmVudCBtZWRpYSBxdWVyeSB0byBlbnN1cmUgdGhhdFxuICogYW55IGZ1cnRoZXIgY2hhbmdlcyB3aWxsIHJlZ2lzdGVyLlxuICpcbiAqIFRoZSBsaXN0ZW5lciBzaG91bGQgZmlyZSBvbiBib3RoIHdpbmRvdyB6b29tIGNoYW5nZXMgYW5kIHN3aXRjaGluZyB0byBhXG4gKiBtb25pdG9yIHdpdGggYSBkaWZmZXJlbnQgRFBJLlxuICovXG5jbGFzcyBTY3JlZW5EcHJNb25pdG9yIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvOiBudW1iZXI7XG4gIHByaXZhdGUgX291dGVyTGlzdGVuZXI6ICgodGhpczogTWVkaWFRdWVyeUxpc3QsIGV2OiBNZWRpYVF1ZXJ5TGlzdEV2ZW50KSA9PiBhbnkpIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3Q6IE1lZGlhUXVlcnlMaXN0IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF93aW5kb3dSZXNpemVMaXN0ZW5lciA9IHRoaXMucmVnaXN0ZXIobmV3IE11dGFibGVEaXNwb3NhYmxlKCkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRHByQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRwckNoYW5nZSA9IHRoaXMuX29uRHByQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BhcmVudFdpbmRvdzogV2luZG93KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgbGlzdGVuZXIgYW5kIGRwciB2YWx1ZVxuICAgIHRoaXMuX291dGVyTGlzdGVuZXIgPSAoKSA9PiB0aGlzLl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCk7XG4gICAgdGhpcy5fY3VycmVudERldmljZVBpeGVsUmF0aW8gPSB0aGlzLl9wYXJlbnRXaW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICB0aGlzLl91cGRhdGVEcHIoKTtcblxuICAgIC8vIE1vbml0b3IgYWN0aXZlIHdpbmRvdyByZXNpemVcbiAgICB0aGlzLl9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lcigpO1xuXG4gICAgLy8gU2V0dXAgYWRkaXRpb25hbCBkaXNwb3NhYmxlc1xuICAgIHRoaXMucmVnaXN0ZXIodG9EaXNwb3NhYmxlKCgpID0+IHRoaXMuY2xlYXJMaXN0ZW5lcigpKSk7XG4gIH1cblxuXG4gIHB1YmxpYyBzZXRXaW5kb3cocGFyZW50V2luZG93OiBXaW5kb3cpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJlbnRXaW5kb3cgPSBwYXJlbnRXaW5kb3c7XG4gICAgdGhpcy5fc2V0V2luZG93UmVzaXplTGlzdGVuZXIoKTtcbiAgICB0aGlzLl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCk7XG4gIH1cblxuICBwcml2YXRlIF9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLl93aW5kb3dSZXNpemVMaXN0ZW5lci52YWx1ZSA9IGFkZERpc3Bvc2FibGVEb21MaXN0ZW5lcih0aGlzLl9wYXJlbnRXaW5kb3csICdyZXNpemUnLCAoKSA9PiB0aGlzLl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0RHByQW5kRmlyZUlmRGlmZmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGFyZW50V2luZG93LmRldmljZVBpeGVsUmF0aW8gIT09IHRoaXMuX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvKSB7XG4gICAgICB0aGlzLl9vbkRwckNoYW5nZS5maXJlKHRoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICB9XG4gICAgdGhpcy5fdXBkYXRlRHByKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEcHIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9vdXRlckxpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xlYXIgbGlzdGVuZXJzIGZvciBvbGQgRFBSXG4gICAgdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0Py5yZW1vdmVMaXN0ZW5lcih0aGlzLl9vdXRlckxpc3RlbmVyKTtcblxuICAgIC8vIEFkZCBsaXN0ZW5lcnMgZm9yIG5ldyBEUFJcbiAgICB0aGlzLl9jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IHRoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO1xuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdCA9IHRoaXMuX3BhcmVudFdpbmRvdy5tYXRjaE1lZGlhKGBzY3JlZW4gYW5kIChyZXNvbHV0aW9uOiAke3RoaXMuX3BhcmVudFdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfWRwcHgpYCk7XG4gICAgdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0LmFkZExpc3RlbmVyKHRoaXMuX291dGVyTGlzdGVuZXIpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZXNvbHV0aW9uTWVkaWFNYXRjaExpc3QgfHwgIXRoaXMuX291dGVyTGlzdGVuZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0LnJlbW92ZUxpc3RlbmVyKHRoaXMuX291dGVyTGlzdGVuZXIpO1xuICAgIHRoaXMuX3Jlc29sdXRpb25NZWRpYU1hdGNoTGlzdCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vdXRlckxpc3RlbmVyID0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTGlua1Byb3ZpZGVyLCBJTGlua1Byb3ZpZGVyU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rUHJvdmlkZXJTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElMaW5rUHJvdmlkZXJTZXJ2aWNlIHtcbiAgZGVjbGFyZSBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxpbmtQcm92aWRlcnM6IElMaW5rUHJvdmlkZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gdGhpcy5saW5rUHJvdmlkZXJzLmxlbmd0aCA9IDApKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckxpbmtQcm92aWRlcihsaW5rUHJvdmlkZXI6IElMaW5rUHJvdmlkZXIpOiBJRGlzcG9zYWJsZSB7XG4gICAgdGhpcy5saW5rUHJvdmlkZXJzLnB1c2gobGlua1Byb3ZpZGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIGxpbmsgcHJvdmlkZXIgZnJvbSB0aGUgbGlzdFxuICAgICAgICBjb25zdCBwcm92aWRlckluZGV4ID0gdGhpcy5saW5rUHJvdmlkZXJzLmluZGV4T2YobGlua1Byb3ZpZGVyKTtcblxuICAgICAgICBpZiAocHJvdmlkZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICB0aGlzLmxpbmtQcm92aWRlcnMuc3BsaWNlKHByb3ZpZGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSU1vdXNlU2VydmljZSB9IGZyb20gJy4vU2VydmljZXMnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzLCBnZXRDb29yZHNSZWxhdGl2ZVRvRWxlbWVudCB9IGZyb20gJ2Jyb3dzZXIvaW5wdXQvTW91c2UnO1xuXG5leHBvcnQgY2xhc3MgTW91c2VTZXJ2aWNlIGltcGxlbWVudHMgSU1vdXNlU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASVJlbmRlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyU2VydmljZTogSVJlbmRlclNlcnZpY2UsXG4gICAgQElDaGFyU2l6ZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY2hhclNpemVTZXJ2aWNlOiBJQ2hhclNpemVTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgcHVibGljIGdldENvb3JkcyhldmVudDoge2NsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyfSwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbENvdW50OiBudW1iZXIsIHJvd0NvdW50OiBudW1iZXIsIGlzU2VsZWN0aW9uPzogYm9vbGVhbik6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBnZXRDb29yZHMoXG4gICAgICB3aW5kb3csXG4gICAgICBldmVudCxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBjb2xDb3VudCxcbiAgICAgIHJvd0NvdW50LFxuICAgICAgdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhhc1ZhbGlkU2l6ZSxcbiAgICAgIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCxcbiAgICAgIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC5oZWlnaHQsXG4gICAgICBpc1NlbGVjdGlvblxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TW91c2VSZXBvcnRDb29yZHMoZXZlbnQ6IE1vdXNlRXZlbnQsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogeyBjb2w6IG51bWJlciwgcm93OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvb3JkcyA9IGdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50KHdpbmRvdywgZXZlbnQsIGVsZW1lbnQpO1xuICAgIGlmICghdGhpcy5fY2hhclNpemVTZXJ2aWNlLmhhc1ZhbGlkU2l6ZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29vcmRzWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoY29vcmRzWzBdLCAwKSwgdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggLSAxKTtcbiAgICBjb29yZHNbMV0gPSBNYXRoLm1pbihNYXRoLm1heChjb29yZHNbMV0sIDApLCB0aGlzLl9yZW5kZXJTZXJ2aWNlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgLSAxKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBNYXRoLmZsb29yKGNvb3Jkc1swXSAvIHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2VsbC53aWR0aCksXG4gICAgICByb3c6IE1hdGguZmxvb3IoY29vcmRzWzFdIC8gdGhpcy5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zLmNzcy5jZWxsLmhlaWdodCksXG4gICAgICB4OiBNYXRoLmZsb29yKGNvb3Jkc1swXSksXG4gICAgICB5OiBNYXRoLmZsb29yKGNvb3Jkc1sxXSlcbiAgICB9O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IFJlbmRlckRlYm91bmNlciB9IGZyb20gJ2Jyb3dzZXIvUmVuZGVyRGVib3VuY2VyJztcbmltcG9ydCB7IElSZW5kZXJEZWJvdW5jZXJXaXRoQ2FsbGJhY2sgfSBmcm9tICdicm93c2VyL1R5cGVzJztcbmltcG9ydCB7IElSZW5kZXJEaW1lbnNpb25zLCBJUmVuZGVyZXIgfSBmcm9tICdicm93c2VyL3JlbmRlcmVyL3NoYXJlZC9UeXBlcyc7XG5pbXBvcnQgeyBJQ2hhclNpemVTZXJ2aWNlLCBJQ29yZUJyb3dzZXJTZXJ2aWNlLCBJUmVuZGVyU2VydmljZSwgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBNdXRhYmxlRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBEZWJvdW5jZWRJZGxlVGFzayB9IGZyb20gJ2NvbW1vbi9UYXNrUXVldWUnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElEZWNvcmF0aW9uU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcblxuaW50ZXJmYWNlIElTZWxlY3Rpb25TdGF0ZSB7XG4gIHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElSZW5kZXJTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX3JlbmRlcmVyOiBNdXRhYmxlRGlzcG9zYWJsZTxJUmVuZGVyZXI+ID0gdGhpcy5yZWdpc3RlcihuZXcgTXV0YWJsZURpc3Bvc2FibGUoKSk7XG4gIHByaXZhdGUgX3JlbmRlckRlYm91bmNlcjogSVJlbmRlckRlYm91bmNlcldpdGhDYWxsYmFjaztcbiAgcHJpdmF0ZSBfcGF1c2VkUmVzaXplVGFzayA9IG5ldyBEZWJvdW5jZWRJZGxlVGFzaygpO1xuICBwcml2YXRlIF9vYnNlcnZlckRpc3Bvc2FibGUgPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwcml2YXRlIF9pc1BhdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9uZWVkc0Z1bGxSZWZyZXNoOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzTmV4dFJlbmRlclJlZHJhd09ubHk6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9uZWVkc1NlbGVjdGlvblJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2FudmFzV2lkdGg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2NhbnZhc0hlaWdodDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc2VsZWN0aW9uU3RhdGU6IElTZWxlY3Rpb25TdGF0ZSA9IHtcbiAgICBzdGFydDogdW5kZWZpbmVkLFxuICAgIGVuZDogdW5kZWZpbmVkLFxuICAgIGNvbHVtblNlbGVjdE1vZGU6IGZhbHNlXG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EaW1lbnNpb25zQ2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElSZW5kZXJEaW1lbnNpb25zPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGltZW5zaW9uc0NoYW5nZSA9IHRoaXMuX29uRGltZW5zaW9uc0NoYW5nZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UgPSB0aGlzLl9vblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVuZGVyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlciA9IHRoaXMuX29uUmVuZGVyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlZnJlc2hSZXF1ZXN0ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlZnJlc2hSZXF1ZXN0ID0gdGhpcy5fb25SZWZyZXNoUmVxdWVzdC5ldmVudDtcblxuICBwdWJsaWMgZ2V0IGRpbWVuc2lvbnMoKTogSVJlbmRlckRpbWVuc2lvbnMgeyByZXR1cm4gdGhpcy5fcmVuZGVyZXIudmFsdWUhLmRpbWVuc2lvbnM7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yb3dDb3VudDogbnVtYmVyLFxuICAgIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIEBJT3B0aW9uc1NlcnZpY2Ugb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBASUNoYXJTaXplU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jaGFyU2l6ZVNlcnZpY2U6IElDaGFyU2l6ZVNlcnZpY2UsXG4gICAgQElEZWNvcmF0aW9uU2VydmljZSBkZWNvcmF0aW9uU2VydmljZTogSURlY29yYXRpb25TZXJ2aWNlLFxuICAgIEBJQnVmZmVyU2VydmljZSBidWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBjb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2UsXG4gICAgQElUaGVtZVNlcnZpY2UgdGhlbWVTZXJ2aWNlOiBJVGhlbWVTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9yZW5kZXJEZWJvdW5jZXIgPSBuZXcgUmVuZGVyRGVib3VuY2VyKChzdGFydCwgZW5kKSA9PiB0aGlzLl9yZW5kZXJSb3dzKHN0YXJ0LCBlbmQpLCBjb3JlQnJvd3NlclNlcnZpY2UpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcmVuZGVyRGVib3VuY2VyKTtcblxuICAgIHRoaXMucmVnaXN0ZXIoY29yZUJyb3dzZXJTZXJ2aWNlLm9uRHByQ2hhbmdlKCgpID0+IHRoaXMuaGFuZGxlRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZSgpKSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKGJ1ZmZlclNlcnZpY2Uub25SZXNpemUoKCkgPT4gdGhpcy5fZnVsbFJlZnJlc2goKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoYnVmZmVyU2VydmljZS5idWZmZXJzLm9uQnVmZmVyQWN0aXZhdGUoKCkgPT4gdGhpcy5fcmVuZGVyZXIudmFsdWU/LmNsZWFyKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKG9wdGlvbnNTZXJ2aWNlLm9uT3B0aW9uQ2hhbmdlKCgpID0+IHRoaXMuX2hhbmRsZU9wdGlvbnNDaGFuZ2VkKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2NoYXJTaXplU2VydmljZS5vbkNoYXJTaXplQ2hhbmdlKCgpID0+IHRoaXMuaGFuZGxlQ2hhclNpemVDaGFuZ2VkKCkpKTtcblxuICAgIC8vIERvIGEgZnVsbCByZWZyZXNoIHdoZW5ldmVyIGFueSBkZWNvcmF0aW9uIGlzIGFkZGVkIG9yIHJlbW92ZWQuIFRoaXMgbWF5IG5vdCBhY3R1YWxseSByZXN1bHRcbiAgICAvLyBpbiBjaGFuZ2VzIGJ1dCBzaW5jZSBkZWNvcmF0aW9ucyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkgb3IgYWRkZWQvcmVtb3ZlZCBhbGwgaW4gdGhlIHNhbWVcbiAgICAvLyBmcmFtZSB0aGlzIHNob3VsZCBoYXZlIG1pbmltYWwgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgIHRoaXMucmVnaXN0ZXIoZGVjb3JhdGlvblNlcnZpY2Uub25EZWNvcmF0aW9uUmVnaXN0ZXJlZCgoKSA9PiB0aGlzLl9mdWxsUmVmcmVzaCgpKSk7XG4gICAgdGhpcy5yZWdpc3RlcihkZWNvcmF0aW9uU2VydmljZS5vbkRlY29yYXRpb25SZW1vdmVkKCgpID0+IHRoaXMuX2Z1bGxSZWZyZXNoKCkpKTtcblxuICAgIC8vIENsZWFyIHRoZSByZW5kZXJlciB3aGVuIHRoZSBhIGNoYW5nZSB0aGF0IGNvdWxkIGFmZmVjdCBnbHlwaHMgb2NjdXJzXG4gICAgdGhpcy5yZWdpc3RlcihvcHRpb25zU2VydmljZS5vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKFtcbiAgICAgICdjdXN0b21HbHlwaHMnLFxuICAgICAgJ2RyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzJyxcbiAgICAgICdsZXR0ZXJTcGFjaW5nJyxcbiAgICAgICdsaW5lSGVpZ2h0JyxcbiAgICAgICdmb250RmFtaWx5JyxcbiAgICAgICdmb250U2l6ZScsXG4gICAgICAnZm9udFdlaWdodCcsXG4gICAgICAnZm9udFdlaWdodEJvbGQnLFxuICAgICAgJ21pbmltdW1Db250cmFzdFJhdGlvJyxcbiAgICAgICdyZXNjYWxlT3ZlcmxhcHBpbmdHbHlwaHMnXG4gICAgXSwgKCkgPT4ge1xuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgdGhpcy5oYW5kbGVSZXNpemUoYnVmZmVyU2VydmljZS5jb2xzLCBidWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgICAgdGhpcy5fZnVsbFJlZnJlc2goKTtcbiAgICB9KSk7XG5cbiAgICAvLyBSZWZyZXNoIHRoZSBjdXJzb3IgbGluZSB3aGVuIHRoZSBjdXJzb3IgY2hhbmdlc1xuICAgIHRoaXMucmVnaXN0ZXIob3B0aW9uc1NlcnZpY2Uub25NdWx0aXBsZU9wdGlvbkNoYW5nZShbXG4gICAgICAnY3Vyc29yQmxpbmsnLFxuICAgICAgJ2N1cnNvclN0eWxlJ1xuICAgIF0sICgpID0+IHRoaXMucmVmcmVzaFJvd3MoYnVmZmVyU2VydmljZS5idWZmZXIueSwgYnVmZmVyU2VydmljZS5idWZmZXIueSwgdHJ1ZSkpKTtcblxuICAgIHRoaXMucmVnaXN0ZXIodGhlbWVTZXJ2aWNlLm9uQ2hhbmdlQ29sb3JzKCgpID0+IHRoaXMuX2Z1bGxSZWZyZXNoKCkpKTtcblxuICAgIHRoaXMuX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdywgc2NyZWVuRWxlbWVudCk7XG4gICAgdGhpcy5yZWdpc3Rlcihjb3JlQnJvd3NlclNlcnZpY2Uub25XaW5kb3dDaGFuZ2UoKHcpID0+IHRoaXMuX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIodywgc2NyZWVuRWxlbWVudCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVySW50ZXJzZWN0aW9uT2JzZXJ2ZXIodzogV2luZG93ICYgdHlwZW9mIGdsb2JhbFRoaXMsIHNjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgLy8gRGV0ZWN0IHdoZXRoZXIgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgaXMgZGV0ZWN0ZWQgYW5kIGVuYWJsZSByZW5kZXJlciBwYXVzZVxuICAgIC8vIGFuZCByZXN1bWUgYmFzZWQgb24gdGVybWluYWwgdmlzaWJpbGl0eSBpZiBzb1xuICAgIGlmICgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IHcuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZSA9PiB0aGlzLl9oYW5kbGVJbnRlcnNlY3Rpb25DaGFuZ2UoZVtlLmxlbmd0aCAtIDFdKSwgeyB0aHJlc2hvbGQ6IDAgfSk7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHNjcmVlbkVsZW1lbnQpO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJEaXNwb3NhYmxlLnZhbHVlID0gdG9EaXNwb3NhYmxlKCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlSW50ZXJzZWN0aW9uQ2hhbmdlKGVudHJ5OiBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5KTogdm9pZCB7XG4gICAgdGhpcy5faXNQYXVzZWQgPSBlbnRyeS5pc0ludGVyc2VjdGluZyA9PT0gdW5kZWZpbmVkID8gKGVudHJ5LmludGVyc2VjdGlvblJhdGlvID09PSAwKSA6ICFlbnRyeS5pc0ludGVyc2VjdGluZztcblxuICAgIC8vIFRlcm1pbmFsIHdhcyBoaWRkZW4gb24gb3BlblxuICAgIGlmICghdGhpcy5faXNQYXVzZWQgJiYgIXRoaXMuX2NoYXJTaXplU2VydmljZS5oYXNWYWxpZFNpemUpIHtcbiAgICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1BhdXNlZCAmJiB0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoKSB7XG4gICAgICB0aGlzLl9wYXVzZWRSZXNpemVUYXNrLmZsdXNoKCk7XG4gICAgICB0aGlzLnJlZnJlc2hSb3dzKDAsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gICAgICB0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZnJlc2hSb3dzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBpc1JlZHJhd09ubHk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc1BhdXNlZCkge1xuICAgICAgdGhpcy5fbmVlZHNGdWxsUmVmcmVzaCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghaXNSZWRyYXdPbmx5KSB7XG4gICAgICB0aGlzLl9pc05leHRSZW5kZXJSZWRyYXdPbmx5ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlckRlYm91bmNlci5yZWZyZXNoKHN0YXJ0LCBlbmQsIHRoaXMuX3Jvd0NvdW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbmRlclJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2luY2UgdGhpcyBpcyBkZWJvdW5jZWQsIGEgcmVzaXplIGV2ZW50IGNvdWxkIGhhdmUgaGFwcGVuZWQgYmV0d2VlbiB0aGUgdGltZSBhIHJlZnJlc2ggd2FzXG4gICAgLy8gcmVxdWVzdGVkIGFuZCB3aGVuIHRoaXMgdHJpZ2dlcnMuIENsYW1wIHRoZSB2YWx1ZXMgb2Ygc3RhcnQgYW5kIGVuZCB0byBlbnN1cmUgdGhleSdyZSB2YWxpZFxuICAgIC8vIGdpdmVuIHRoZSBjdXJyZW50IHZpZXdwb3J0IHN0YXRlLlxuICAgIHN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuXG4gICAgLy8gUmVuZGVyXG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWUucmVuZGVyUm93cyhzdGFydCwgZW5kKTtcblxuICAgIC8vIFVwZGF0ZSBzZWxlY3Rpb24gaWYgbmVlZGVkXG4gICAgaWYgKHRoaXMuX25lZWRzU2VsZWN0aW9uUmVmcmVzaCkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIudmFsdWUuaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCh0aGlzLl9zZWxlY3Rpb25TdGF0ZS5zdGFydCwgdGhpcy5fc2VsZWN0aW9uU3RhdGUuZW5kLCB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5jb2x1bW5TZWxlY3RNb2RlKTtcbiAgICAgIHRoaXMuX25lZWRzU2VsZWN0aW9uUmVmcmVzaCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEZpcmUgcmVuZGVyIGV2ZW50IG9ubHkgaWYgaXQgd2FzIG5vdCBhIHJlZHJhd1xuICAgIGlmICghdGhpcy5faXNOZXh0UmVuZGVyUmVkcmF3T25seSkge1xuICAgICAgdGhpcy5fb25SZW5kZXJlZFZpZXdwb3J0Q2hhbmdlLmZpcmUoeyBzdGFydCwgZW5kIH0pO1xuICAgIH1cbiAgICB0aGlzLl9vblJlbmRlci5maXJlKHsgc3RhcnQsIGVuZCB9KTtcbiAgICB0aGlzLl9pc05leHRSZW5kZXJSZWRyYXdPbmx5ID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yb3dDb3VudCA9IHJvd3M7XG4gICAgdGhpcy5fZmlyZU9uQ2FudmFzUmVzaXplKCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVPcHRpb25zQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFJvd3MoMCwgdGhpcy5fcm93Q291bnQgLSAxKTtcbiAgICB0aGlzLl9maXJlT25DYW52YXNSZXNpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpcmVPbkNhbnZhc1Jlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIERvbid0IGZpcmUgdGhlIGV2ZW50IGlmIHRoZSBkaW1lbnNpb25zIGhhdmVuJ3QgY2hhbmdlZFxuICAgIGlmICh0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zLmNzcy5jYW52YXMud2lkdGggPT09IHRoaXMuX2NhbnZhc1dpZHRoICYmIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmRpbWVuc2lvbnMuY3NzLmNhbnZhcy5oZWlnaHQgPT09IHRoaXMuX2NhbnZhc0hlaWdodCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9vbkRpbWVuc2lvbnNDaGFuZ2UuZmlyZSh0aGlzLl9yZW5kZXJlci52YWx1ZS5kaW1lbnNpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNSZW5kZXJlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9yZW5kZXJlci52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRSZW5kZXJlcihyZW5kZXJlcjogSVJlbmRlcmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWUgPSByZW5kZXJlcjtcbiAgICAvLyBJZiB0aGUgdmFsdWUgd2FzIG5vdCBzZXQsIHRoZSB0ZXJtaW5hbCBpcyBiZWluZyBkaXNwb3NlZCBzbyBpZ25vcmUgaXRcbiAgICBpZiAodGhpcy5fcmVuZGVyZXIudmFsdWUpIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLm9uUmVxdWVzdFJlZHJhdyhlID0+IHRoaXMucmVmcmVzaFJvd3MoZS5zdGFydCwgZS5lbmQsIHRydWUpKTtcblxuICAgICAgLy8gRm9yY2UgYSByZWZyZXNoXG4gICAgICB0aGlzLl9uZWVkc1NlbGVjdGlvblJlZnJlc2ggPSB0cnVlO1xuICAgICAgdGhpcy5fZnVsbFJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWRkUmVmcmVzaENhbGxiYWNrKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbmRlckRlYm91bmNlci5hZGRSZWZyZXNoQ2FsbGJhY2soY2FsbGJhY2spO1xuICB9XG5cbiAgcHJpdmF0ZSBfZnVsbFJlZnJlc2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzUGF1c2VkKSB7XG4gICAgICB0aGlzLl9uZWVkc0Z1bGxSZWZyZXNoID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWZyZXNoUm93cygwLCB0aGlzLl9yb3dDb3VudCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmNsZWFyVGV4dHVyZUF0bGFzPy4oKTtcbiAgICB0aGlzLl9mdWxsUmVmcmVzaCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTogdm9pZCB7XG4gICAgLy8gRm9yY2UgY2hhciBzaXplIG1lYXN1cmVtZW50IGFzIERvbU1lYXN1cmVTdHJhdGVneShnZXRCb3VuZGluZ0NsaWVudFJlY3QpIGlzIG5vdCBzdGFibGVcbiAgICAvLyB3aGVuIGRldmljZVBpeGVsUmF0aW8gY2hhbmdlc1xuICAgIHRoaXMuX2NoYXJTaXplU2VydmljZS5tZWFzdXJlKCk7XG5cbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVyLnZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlLmhhbmRsZURldmljZVBpeGVsUmF0aW9DaGFuZ2UoKTtcbiAgICB0aGlzLnJlZnJlc2hSb3dzKDAsIHRoaXMuX3Jvd0NvdW50IC0gMSk7XG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUmVzaXplKGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9yZW5kZXJlci52YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNQYXVzZWQpIHtcbiAgICAgIHRoaXMuX3BhdXNlZFJlc2l6ZVRhc2suc2V0KCgpID0+IHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5oYW5kbGVSZXNpemUoY29scywgcm93cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci52YWx1ZS5oYW5kbGVSZXNpemUoY29scywgcm93cyk7XG4gICAgfVxuICAgIHRoaXMuX2Z1bGxSZWZyZXNoKCk7XG4gIH1cblxuICAvLyBUT0RPOiBJcyB0aGlzIHVzZWZ1bCB3aGVuIHdlIGhhdmUgb25SZXNpemU/XG4gIHB1YmxpYyBoYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUNoYXJTaXplQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmhhbmRsZUJsdXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVGb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlRm9jdXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuX3NlbGVjdGlvblN0YXRlLmVuZCA9IGVuZDtcbiAgICB0aGlzLl9zZWxlY3Rpb25TdGF0ZS5jb2x1bW5TZWxlY3RNb2RlID0gY29sdW1uU2VsZWN0TW9kZTtcbiAgICB0aGlzLl9yZW5kZXJlci52YWx1ZT8uaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChzdGFydCwgZW5kLCBjb2x1bW5TZWxlY3RNb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnZhbHVlPy5oYW5kbGVDdXJzb3JNb3ZlKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVuZGVyZXIudmFsdWU/LmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlclJhbmdlLCBJTGlua2lmaWVyMiB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgZ2V0Q29vcmRzUmVsYXRpdmVUb0VsZW1lbnQgfSBmcm9tICdicm93c2VyL2lucHV0L01vdXNlJztcbmltcG9ydCB7IG1vdmVUb0NlbGxTZXF1ZW5jZSB9IGZyb20gJ2Jyb3dzZXIvaW5wdXQvTW92ZVRvQ2VsbCc7XG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ2Jyb3dzZXIvc2VsZWN0aW9uL1NlbGVjdGlvbk1vZGVsJztcbmltcG9ydCB7IElTZWxlY3Rpb25SZWRyYXdSZXF1ZXN0RXZlbnQsIElTZWxlY3Rpb25SZXF1ZXN0U2Nyb2xsTGluZXNFdmVudCB9IGZyb20gJ2Jyb3dzZXIvc2VsZWN0aW9uL1R5cGVzJztcbmltcG9ydCB7IElDb3JlQnJvd3NlclNlcnZpY2UsIElNb3VzZVNlcnZpY2UsIElSZW5kZXJTZXJ2aWNlLCBJU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBEaXNwb3NhYmxlLCB0b0Rpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCAqIGFzIEJyb3dzZXIgZnJvbSAnY29tbW9uL1BsYXRmb3JtJztcbmltcG9ydCB7IElCdWZmZXJMaW5lLCBJRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBnZXRSYW5nZUxlbmd0aCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyUmFuZ2UnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IElCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJQ29yZVNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbi8qKlxuICogVGhlIG51bWJlciBvZiBwaXhlbHMgdGhlIG1vdXNlIG5lZWRzIHRvIGJlIGFib3ZlIG9yIGJlbG93IHRoZSB2aWV3cG9ydCBpblxuICogb3JkZXIgdG8gc2Nyb2xsIGF0IHRoZSBtYXhpbXVtIHNwZWVkLlxuICovXG5jb25zdCBEUkFHX1NDUk9MTF9NQVhfVEhSRVNIT0xEID0gNTA7XG5cbi8qKlxuICogVGhlIG1heGltdW0gc2Nyb2xsaW5nIHNwZWVkXG4gKi9cbmNvbnN0IERSQUdfU0NST0xMX01BWF9TUEVFRCA9IDE1O1xuXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJldHdlZW4gZHJhZyBzY3JvbGwgdXBkYXRlcy5cbiAqL1xuY29uc3QgRFJBR19TQ1JPTExfSU5URVJWQUwgPSA1MDtcblxuLyoqXG4gKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0aGF0IGNhbiBoYXZlIGVsYXBzZWQgZm9yIGFuIGFsdCBjbGljayB0byBtb3ZlIHRoZVxuICogY3Vyc29yLlxuICovXG5jb25zdCBBTFRfQ0xJQ0tfTU9WRV9DVVJTT1JfVElNRSA9IDUwMDtcblxuY29uc3QgTk9OX0JSRUFLSU5HX1NQQUNFX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCk7XG5jb25zdCBBTExfTk9OX0JSRUFLSU5HX1NQQUNFX1JFR0VYID0gbmV3IFJlZ0V4cChOT05fQlJFQUtJTkdfU1BBQ0VfQ0hBUiwgJ2cnKTtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcG9zaXRpb24gb2YgYSB3b3JkIG9uIGEgbGluZS5cbiAqL1xuaW50ZXJmYWNlIElXb3JkUG9zaXRpb24ge1xuICBzdGFydDogbnVtYmVyO1xuICBsZW5ndGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIHNlbGVjdGlvbiBtb2RlLCB0aGlzIGRyaXZlcyBob3cgdGhlIHNlbGVjdGlvbiBiZWhhdmVzIG9uIG1vdXNlIG1vdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlbGVjdGlvbk1vZGUge1xuICBOT1JNQUwsXG4gIFdPUkQsXG4gIExJTkUsXG4gIENPTFVNTlxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBtYW5hZ2VzIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHRlcm1pbmFsLiBXaXRoIGhlbHAgZnJvbVxuICogU2VsZWN0aW9uTW9kZWwsIFNlbGVjdGlvblNlcnZpY2UgaGFuZGxlcyB3aXRoIGFsbCBsb2dpYyBhc3NvY2lhdGVkIHdpdGhcbiAqIGRlYWxpbmcgd2l0aCB0aGUgc2VsZWN0aW9uLCBpbmNsdWRpbmcgaGFuZGxpbmcgbW91c2UgaW50ZXJhY3Rpb24sIHdpZGVcbiAqIGNoYXJhY3RlcnMgYW5kIGZldGNoaW5nIHRoZSBhY3R1YWwgdGV4dCB3aXRoaW4gdGhlIHNlbGVjdGlvbi4gUmVuZGVyaW5nIGlzXG4gKiBub3QgaGFuZGxlZCBieSB0aGUgU2VsZWN0aW9uU2VydmljZSBidXQgdGhlIG9uUmVkcmF3UmVxdWVzdCBldmVudCBpcyBmaXJlZFxuICogd2hlbiB0aGUgc2VsZWN0aW9uIGlzIHJlYWR5IHRvIGJlIHJlZHJhd24gKG9uIGFuIGFuaW1hdGlvbiBmcmFtZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25TZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfbW9kZWw6IFNlbGVjdGlvbk1vZGVsO1xuXG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IHRvIHNjcm9sbCBldmVyeSBkcmFnIHNjcm9sbCB1cGRhdGUgKGRlcGVuZHMgb24gaG93IGZhciB0aGUgbW91c2VcbiAgICogZHJhZyBpcyBhYm92ZSBvciBiZWxvdyB0aGUgdGVybWluYWwpLlxuICAgKi9cbiAgcHJpdmF0ZSBfZHJhZ1Njcm9sbEFtb3VudDogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIG1vZGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2FjdGl2ZVNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvbk1vZGU7XG5cbiAgLyoqXG4gICAqIEEgc2V0SW50ZXJ2YWwgdGltZXIgdGhhdCBpcyBhY3RpdmUgd2hpbGUgdGhlIG1vdXNlIGlzIGRvd24gd2hvc2UgY2FsbGJhY2tcbiAgICogc2Nyb2xscyB0aGUgdmlld3BvcnQgd2hlbiBuZWNlc3NhcnkuXG4gICAqL1xuICBwcml2YXRlIF9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgYW5pbWF0aW9uIGZyYW1lIElEIHVzZWQgZm9yIHJlZnJlc2hpbmcgdGhlIHNlbGVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX3JlZnJlc2hBbmltYXRpb25GcmFtZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHNlbGVjdGlvbiBpcyBlbmFibGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZW5hYmxlZCA9IHRydWU7XG5cbiAgcHJpdmF0ZSBfbW91c2VNb3ZlTGlzdGVuZXI6IEV2ZW50TGlzdGVuZXI7XG4gIHByaXZhdGUgX21vdXNlVXBMaXN0ZW5lcjogRXZlbnRMaXN0ZW5lcjtcbiAgcHJpdmF0ZSBfdHJpbUxpc3RlbmVyOiBJRGlzcG9zYWJsZTtcbiAgcHJpdmF0ZSBfd29ya0NlbGw6IENlbGxEYXRhID0gbmV3IENlbGxEYXRhKCk7XG5cbiAgcHJpdmF0ZSBfbW91c2VEb3duVGltZVN0YW1wOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9vbGRIYXNTZWxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfb2xkU2VsZWN0aW9uU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX29sZFNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkxpbnV4TW91c2VTZWxlY3Rpb24gPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uTGludXhNb3VzZVNlbGVjdGlvbiA9IHRoaXMuX29uTGludXhNb3VzZVNlbGVjdGlvbi5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZWRyYXdSZXF1ZXN0ID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElTZWxlY3Rpb25SZWRyYXdSZXF1ZXN0RXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0UmVkcmF3ID0gdGhpcy5fb25SZWRyYXdSZXF1ZXN0LmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNlbGVjdGlvbkNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uU2VsZWN0aW9uQ2hhbmdlID0gdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFNjcm9sbExpbmVzID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElTZWxlY3Rpb25SZXF1ZXN0U2Nyb2xsTGluZXNFdmVudD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RTY3JvbGxMaW5lcyA9IHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NjcmVlbkVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2xpbmtpZmllcjogSUxpbmtpZmllcjIsXG4gICAgQElCdWZmZXJTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlclNlcnZpY2U6IElCdWZmZXJTZXJ2aWNlLFxuICAgIEBJQ29yZVNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfY29yZVNlcnZpY2U6IElDb3JlU2VydmljZSxcbiAgICBASU1vdXNlU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9tb3VzZVNlcnZpY2U6IElNb3VzZVNlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlLFxuICAgIEBJUmVuZGVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJTZXJ2aWNlOiBJUmVuZGVyU2VydmljZSxcbiAgICBASUNvcmVCcm93c2VyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9jb3JlQnJvd3NlclNlcnZpY2U6IElDb3JlQnJvd3NlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXQgbGlzdGVuZXJzXG4gICAgdGhpcy5fbW91c2VNb3ZlTGlzdGVuZXIgPSBldmVudCA9PiB0aGlzLl9oYW5kbGVNb3VzZU1vdmUoZXZlbnQgYXMgTW91c2VFdmVudCk7XG4gICAgdGhpcy5fbW91c2VVcExpc3RlbmVyID0gZXZlbnQgPT4gdGhpcy5faGFuZGxlTW91c2VVcChldmVudCBhcyBNb3VzZUV2ZW50KTtcbiAgICB0aGlzLl9jb3JlU2VydmljZS5vblVzZXJJbnB1dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuX3RyaW1MaXN0ZW5lciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLm9uVHJpbShhbW91bnQgPT4gdGhpcy5faGFuZGxlVHJpbShhbW91bnQpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5vbkJ1ZmZlckFjdGl2YXRlKGUgPT4gdGhpcy5faGFuZGxlQnVmZmVyQWN0aXZhdGUoZSkpKTtcblxuICAgIHRoaXMuZW5hYmxlKCk7XG5cbiAgICB0aGlzLl9tb2RlbCA9IG5ldyBTZWxlY3Rpb25Nb2RlbCh0aGlzLl9idWZmZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZS5OT1JNQUw7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVNb3VzZURvd25MaXN0ZW5lcnMoKTtcbiAgICB9KSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclNlbGVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBzZWxlY3Rpb24gbWFuYWdlci4gVGhpcyBpcyB1c2VmdWwgZm9yIHdoZW4gdGVybWluYWwgbW91c2VcbiAgICogYXJlIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgc2VsZWN0aW9uIG1hbmFnZXIuXG4gICAqL1xuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3Rpb25TdGFydCgpOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uU3RhcnQ7IH1cbiAgcHVibGljIGdldCBzZWxlY3Rpb25FbmQoKTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDsgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHdoZXRoZXIgdGhlcmUgaXMgYW4gYWN0aXZlIHRleHQgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldCBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kO1xuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gc3RhcnRbMF0gIT09IGVuZFswXSB8fCBzdGFydFsxXSAhPT0gZW5kWzFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRleHQgY3VycmVudGx5IHNlbGVjdGVkLlxuICAgKi9cbiAgcHVibGljIGdldCBzZWxlY3Rpb25UZXh0KCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kO1xuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyO1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkNPTFVNTikge1xuICAgICAgLy8gSWdub3JlIHplcm8gd2lkdGggc2VsZWN0aW9uc1xuICAgICAgaWYgKHN0YXJ0WzBdID09PSBlbmRbMF0pIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgY29sdW1uIHNlbGVjdGlvbiBpdCdzIG5vdCBlbm91Z2ggdG8gcmVseSBvbiBmaW5hbCBzZWxlY3Rpb24ncyBzd2FwcGluZyBvZiByZXZlcnNlZFxuICAgICAgLy8gdmFsdWVzLCBpdCBhbHNvIG5lZWRzIHRoZSB4IGNvb3JkaW5hdGVzIHRvIHN3YXAgaW5kZXBlbmRlbnRseSBvZiB0aGUgeSBjb29yZGluYXRlIGlzIG5lZWRlZFxuICAgICAgY29uc3Qgc3RhcnRDb2wgPSBzdGFydFswXSA8IGVuZFswXSA/IHN0YXJ0WzBdIDogZW5kWzBdO1xuICAgICAgY29uc3QgZW5kQ29sID0gc3RhcnRbMF0gPCBlbmRbMF0gPyBlbmRbMF0gOiBzdGFydFswXTtcbiAgICAgIGZvciAobGV0IGkgPSBzdGFydFsxXTsgaSA8PSBlbmRbMV07IGkrKykge1xuICAgICAgICBjb25zdCBsaW5lVGV4dCA9IGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoaSwgdHJ1ZSwgc3RhcnRDb2wsIGVuZENvbCk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGxpbmVUZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gR2V0IGZpcnN0IHJvd1xuICAgICAgY29uc3Qgc3RhcnRSb3dFbmRDb2wgPSBzdGFydFsxXSA9PT0gZW5kWzFdID8gZW5kWzBdIDogdW5kZWZpbmVkO1xuICAgICAgcmVzdWx0LnB1c2goYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhzdGFydFsxXSwgdHJ1ZSwgc3RhcnRbMF0sIHN0YXJ0Um93RW5kQ29sKSk7XG5cbiAgICAgIC8vIEdldCBtaWRkbGUgcm93c1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0WzFdICsgMTsgaSA8PSBlbmRbMV0gLSAxOyBpKyspIHtcbiAgICAgICAgY29uc3QgYnVmZmVyTGluZSA9IGJ1ZmZlci5saW5lcy5nZXQoaSk7XG4gICAgICAgIGNvbnN0IGxpbmVUZXh0ID0gYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhpLCB0cnVlKTtcbiAgICAgICAgaWYgKGJ1ZmZlckxpbmU/LmlzV3JhcHBlZCkge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gKz0gbGluZVRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gobGluZVRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBmaW5hbCByb3dcbiAgICAgIGlmIChzdGFydFsxXSAhPT0gZW5kWzFdKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGVuZFsxXSk7XG4gICAgICAgIGNvbnN0IGxpbmVUZXh0ID0gYnVmZmVyLnRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhlbmRbMV0sIHRydWUsIDAsIGVuZFswXSk7XG4gICAgICAgIGlmIChidWZmZXJMaW5lICYmIGJ1ZmZlckxpbmUhLmlzV3JhcHBlZCkge1xuICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gKz0gbGluZVRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gobGluZVRleHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0IHN0cmluZyBieSByZXBsYWNpbmcgbm9uLWJyZWFraW5nIHNwYWNlIGNoYXJzIHdpdGggcmVndWxhciBzcGFjZXNcbiAgICAvLyBhbmQgam9pbmluZyB0aGUgYXJyYXkgaW50byBhIG11bHRpLWxpbmUgc3RyaW5nLlxuICAgIGNvbnN0IGZvcm1hdHRlZFJlc3VsdCA9IHJlc3VsdC5tYXAobGluZSA9PiB7XG4gICAgICByZXR1cm4gbGluZS5yZXBsYWNlKEFMTF9OT05fQlJFQUtJTkdfU1BBQ0VfUkVHRVgsICcgJyk7XG4gICAgfSkuam9pbihCcm93c2VyLmlzV2luZG93cyA/ICdcXHJcXG4nIDogJ1xcbicpO1xuXG4gICAgcmV0dXJuIGZvcm1hdHRlZFJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgdGVybWluYWwgc2VsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgdGhpcy5fb25TZWxlY3Rpb25DaGFuZ2UuZmlyZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIHJlZnJlc2gsIHJlZHJhd2luZyB0aGUgc2VsZWN0aW9uIG9uIHRoZSBuZXh0IG9wcG9ydHVuaXR5LlxuICAgKiBAcGFyYW0gaXNMaW51eE1vdXNlU2VsZWN0aW9uIFdoZXRoZXIgdGhlIHNlbGVjdGlvbiBzaG91bGQgYmUgcmVnaXN0ZXJlZCBhcyBhIG5ld1xuICAgKiBzZWxlY3Rpb24gb24gTGludXguXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaChpc0xpbnV4TW91c2VTZWxlY3Rpb24/OiBib29sZWFuKTogdm9pZCB7XG4gICAgLy8gUXVldWUgdGhlIHJlZnJlc2ggZm9yIHRoZSByZW5kZXJlclxuICAgIGlmICghdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSB0aGlzLl9jb3JlQnJvd3NlclNlcnZpY2Uud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl9yZWZyZXNoKCkpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBwbGF0Zm9ybSBpcyBMaW51eCBhbmQgdGhlIHJlZnJlc2ggY2FsbCBjb21lcyBmcm9tIGEgbW91c2UgZXZlbnQsXG4gICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHNlbGVjdGlvbiBmb3IgbWlkZGxlIGNsaWNrIHRvIHBhc3RlIHNlbGVjdGlvbi5cbiAgICBpZiAoQnJvd3Nlci5pc0xpbnV4ICYmIGlzTGludXhNb3VzZVNlbGVjdGlvbikge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uVGV4dCA9IHRoaXMuc2VsZWN0aW9uVGV4dDtcbiAgICAgIGlmIChzZWxlY3Rpb25UZXh0Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9vbkxpbnV4TW91c2VTZWxlY3Rpb24uZmlyZSh0aGlzLnNlbGVjdGlvblRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB0aGUgcmVmcmVzaCBldmVudCwgY2F1c2luZyBjb25zdW1lcnMgdG8gcGljayBpdCB1cCBhbmQgcmVkcmF3IHRoZVxuICAgKiBzZWxlY3Rpb24gc3RhdGUuXG4gICAqL1xuICBwcml2YXRlIF9yZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vblJlZHJhd1JlcXVlc3QuZmlyZSh7XG4gICAgICBzdGFydDogdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydCxcbiAgICAgIGVuZDogdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25FbmQsXG4gICAgICBjb2x1bW5TZWxlY3RNb2RlOiB0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLkNPTFVNTlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBjbGljayB3YXMgaW5zaWRlIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAqL1xuICBwcml2YXRlIF9pc0NsaWNrSW5TZWxlY3Rpb24oZXZlbnQ6IE1vdXNlRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX21vZGVsLmZpbmFsU2VsZWN0aW9uRW5kO1xuXG4gICAgaWYgKCFzdGFydCB8fCAhZW5kIHx8ICFjb29yZHMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYXJlQ29vcmRzSW5TZWxlY3Rpb24oY29vcmRzLCBzdGFydCwgZW5kKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0NlbGxJblNlbGVjdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcbiAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FyZUNvb3Jkc0luU2VsZWN0aW9uKFt4LCB5XSwgc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2FyZUNvb3Jkc0luU2VsZWN0aW9uKGNvb3JkczogW251bWJlciwgbnVtYmVyXSwgc3RhcnQ6IFtudW1iZXIsIG51bWJlcl0sIGVuZDogW251bWJlciwgbnVtYmVyXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY29vcmRzWzFdID4gc3RhcnRbMV0gJiYgY29vcmRzWzFdIDwgZW5kWzFdKSB8fFxuICAgICAgICAoc3RhcnRbMV0gPT09IGVuZFsxXSAmJiBjb29yZHNbMV0gPT09IHN0YXJ0WzFdICYmIGNvb3Jkc1swXSA+PSBzdGFydFswXSAmJiBjb29yZHNbMF0gPCBlbmRbMF0pIHx8XG4gICAgICAgIChzdGFydFsxXSA8IGVuZFsxXSAmJiBjb29yZHNbMV0gPT09IGVuZFsxXSAmJiBjb29yZHNbMF0gPCBlbmRbMF0pIHx8XG4gICAgICAgIChzdGFydFsxXSA8IGVuZFsxXSAmJiBjb29yZHNbMV0gPT09IHN0YXJ0WzFdICYmIGNvb3Jkc1swXSA+PSBzdGFydFswXSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyB3b3JkIGF0IHRoZSBjdXJyZW50IG1vdXNlIGV2ZW50IGNvb3JkaW5hdGVzLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VsZWN0V29yZEF0Q3Vyc29yKGV2ZW50OiBNb3VzZUV2ZW50LCBhbGxvd1doaXRlc3BhY2VPbmx5U2VsZWN0aW9uOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBsaW5rIHVuZGVyIHRoZSBjdXJzb3IgZmlyc3QgYW5kIHNlbGVjdCB0aGF0IGlmIHNvXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9saW5raWZpZXIuY3VycmVudExpbms/Lmxpbms/LnJhbmdlO1xuICAgIGlmIChyYW5nZSkge1xuICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQgPSBbcmFuZ2Uuc3RhcnQueCAtIDEsIHJhbmdlLnN0YXJ0LnkgLSAxXTtcbiAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0TGVuZ3RoID0gZ2V0UmFuZ2VMZW5ndGgocmFuZ2UsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyk7XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgdGhpcy5fc2VsZWN0V29yZEF0KGNvb3JkcywgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbik7XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYWxsIHRleHQgd2l0aGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kZWwuaXNTZWxlY3RBbGxBY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIHRoaXMuX29uU2VsZWN0aW9uQ2hhbmdlLmZpcmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMaW5lcyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX21vZGVsLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgc3RhcnQgPSBNYXRoLm1heChzdGFydCwgMCk7XG4gICAgZW5kID0gTWF0aC5taW4oZW5kLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCA9IFswLCBzdGFydF07XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gW3RoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgZW5kXTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRoZSBidWZmZXIgYmVpbmcgdHJpbW1lZCwgYWRqdXN0IHRoZSBzZWxlY3Rpb24gcG9zaXRpb24uXG4gICAqIEBwYXJhbSBhbW91bnQgVGhlIGFtb3VudCB0aGUgYnVmZmVyIGlzIGJlaW5nIHRyaW1tZWQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVUcmltKGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgbmVlZHNSZWZyZXNoID0gdGhpcy5fbW9kZWwuaGFuZGxlVHJpbShhbW91bnQpO1xuICAgIGlmIChuZWVkc1JlZnJlc2gpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSAwLWJhc2VkIFt4LCB5XSBidWZmZXIgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQgbW91c2UgZXZlbnQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudDogTW91c2VFdmVudCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuX21vdXNlU2VydmljZS5nZXRDb29yZHMoZXZlbnQsIHRoaXMuX3NjcmVlbkVsZW1lbnQsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLCB0cnVlKTtcbiAgICBpZiAoIWNvb3Jkcykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIDAtYmFzZWRcbiAgICBjb29yZHNbMF0tLTtcbiAgICBjb29yZHNbMV0tLTtcblxuICAgIC8vIENvbnZlcnQgdmlld3BvcnQgY29vcmRzIHRvIGJ1ZmZlciBjb29yZHNcbiAgICBjb29yZHNbMV0gKz0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWRpc3A7XG4gICAgcmV0dXJuIGNvb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBhbW91bnQgdGhlIHZpZXdwb3J0IHNob3VsZCBiZSBzY3JvbGxlZCBiYXNlZCBvbiBob3cgZmFyIG91dCBvZiB0aGVcbiAgICogdGVybWluYWwgdGhlIG1vdXNlIGlzLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0TW91c2VFdmVudFNjcm9sbEFtb3VudChldmVudDogTW91c2VFdmVudCk6IG51bWJlciB7XG4gICAgbGV0IG9mZnNldCA9IGdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50KHRoaXMuX2NvcmVCcm93c2VyU2VydmljZS53aW5kb3csIGV2ZW50LCB0aGlzLl9zY3JlZW5FbGVtZW50KVsxXTtcbiAgICBjb25zdCB0ZXJtaW5hbEhlaWdodCA9IHRoaXMuX3JlbmRlclNlcnZpY2UuZGltZW5zaW9ucy5jc3MuY2FudmFzLmhlaWdodDtcbiAgICBpZiAob2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IHRlcm1pbmFsSGVpZ2h0KSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKG9mZnNldCA+IHRlcm1pbmFsSGVpZ2h0KSB7XG4gICAgICBvZmZzZXQgLT0gdGVybWluYWxIZWlnaHQ7XG4gICAgfVxuXG4gICAgb2Zmc2V0ID0gTWF0aC5taW4oTWF0aC5tYXgob2Zmc2V0LCAtRFJBR19TQ1JPTExfTUFYX1RIUkVTSE9MRCksIERSQUdfU0NST0xMX01BWF9USFJFU0hPTEQpO1xuICAgIG9mZnNldCAvPSBEUkFHX1NDUk9MTF9NQVhfVEhSRVNIT0xEO1xuICAgIHJldHVybiAob2Zmc2V0IC8gTWF0aC5hYnMob2Zmc2V0KSkgKyBNYXRoLnJvdW5kKG9mZnNldCAqIChEUkFHX1NDUk9MTF9NQVhfU1BFRUQgLSAxKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBzaG91bGQgZm9yY2Ugc2VsZWN0aW9uLCByZWdhcmRsZXNzIG9mXG4gICAqIHdoZXRoZXIgdGhlIHRlcm1pbmFsIGlzIGluIG1vdXNlIGV2ZW50cyBtb2RlLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIHNob3VsZEZvcmNlU2VsZWN0aW9uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKEJyb3dzZXIuaXNNYWMpIHtcbiAgICAgIHJldHVybiBldmVudC5hbHRLZXkgJiYgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5tYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0ZSBtb3VzZWRvd24gZXZlbnQsIHNldHRpbmcgdXAgZm9yIGEgbmV3IHNlbGVjdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZWRvd24gZXZlbnQuXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fbW91c2VEb3duVGltZVN0YW1wID0gZXZlbnQudGltZVN0YW1wO1xuICAgIC8vIElmIHdlIGhhdmUgc2VsZWN0aW9uLCB3ZSB3YW50IHRoZSBjb250ZXh0IG1lbnUgb24gcmlnaHQgY2xpY2sgZXZlbiBpZiB0aGVcbiAgICAvLyB0ZXJtaW5hbCBpcyBpbiBtb3VzZSBtb2RlLlxuICAgIGlmIChldmVudC5idXR0b24gPT09IDIgJiYgdGhpcy5oYXNTZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGFjdGlvbiB0aGUgcHJpbWFyeSBidXR0b25cbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxsb3cgc2VsZWN0aW9uIHdoZW4gdXNpbmcgYSBzcGVjaWZpYyBtb2RpZmllciBrZXksIGV2ZW4gd2hlbiBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZEZvcmNlU2VsZWN0aW9uKGV2ZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IHNlbmQgdGhlIG1vdXNlIGRvd24gZXZlbnQgdG8gdGhlIGN1cnJlbnQgcHJvY2Vzcywgd2Ugd2FudCB0byBzZWxlY3RcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIC8vIFRlbGwgdGhlIGJyb3dzZXIgbm90IHRvIHN0YXJ0IGEgcmVndWxhciBzZWxlY3Rpb25cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgLy8gUmVzZXQgZHJhZyBzY3JvbGwgc3RhdGVcbiAgICB0aGlzLl9kcmFnU2Nyb2xsQW1vdW50ID0gMDtcblxuICAgIGlmICh0aGlzLl9lbmFibGVkICYmIGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLl9oYW5kbGVJbmNyZW1lbnRhbENsaWNrKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGV2ZW50LmRldGFpbCA9PT0gMSkge1xuICAgICAgICB0aGlzLl9oYW5kbGVTaW5nbGVDbGljayhldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmRldGFpbCA9PT0gMikge1xuICAgICAgICB0aGlzLl9oYW5kbGVEb3VibGVDbGljayhldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmRldGFpbCA9PT0gMykge1xuICAgICAgICB0aGlzLl9oYW5kbGVUcmlwbGVDbGljayhldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYWRkTW91c2VEb3duTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5yZWZyZXNoKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgbGlzdGVuZXJzIHdoZW4gbW91c2Vkb3duIGlzIHRyaWdnZXJlZC5cbiAgICovXG4gIHByaXZhdGUgX2FkZE1vdXNlRG93bkxpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBMaXN0ZW4gb24gdGhlIGRvY3VtZW50IHNvIHRoYXQgZHJhZ2dpbmcgb3V0c2lkZSBvZiB2aWV3cG9ydCB3b3Jrc1xuICAgIGlmICh0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQpIHtcbiAgICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9tb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgICB0aGlzLl9zY3JlZW5FbGVtZW50Lm93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX21vdXNlVXBMaXN0ZW5lcik7XG4gICAgfVxuICAgIHRoaXMuX2RyYWdTY3JvbGxJbnRlcnZhbFRpbWVyID0gdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLl9kcmFnU2Nyb2xsKCksIERSQUdfU0NST0xMX0lOVEVSVkFMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lcnMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aGVuIG1vdXNlZG93biBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICBwcml2YXRlIF9yZW1vdmVNb3VzZURvd25MaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgdGhpcy5fc2NyZWVuRWxlbWVudC5vd25lckRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX21vdXNlTW92ZUxpc3RlbmVyKTtcbiAgICAgIHRoaXMuX3NjcmVlbkVsZW1lbnQub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fbW91c2VVcExpc3RlbmVyKTtcbiAgICB9XG4gICAgdGhpcy5fY29yZUJyb3dzZXJTZXJ2aWNlLndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuX2RyYWdTY3JvbGxJbnRlcnZhbFRpbWVyKTtcbiAgICB0aGlzLl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhbiBpbmNyZW1lbnRhbCBjbGljaywgc2V0dGluZyB0aGUgc2VsZWN0aW9uIGVuZCBwb3NpdGlvbiB0byB0aGUgbW91c2VcbiAgICogcG9zaXRpb24uXG4gICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVJbmNyZW1lbnRhbENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0KSB7XG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgc2luZ2xlIGNsaWNrLCByZXNldHRpbmcgcmVsZXZhbnQgc3RhdGUgYW5kIHNldHRpbmcgdGhlIHNlbGVjdGlvblxuICAgKiBzdGFydCBwb3NpdGlvbi5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZVNpbmdsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnRMZW5ndGggPSAwO1xuICAgIHRoaXMuX21vZGVsLmlzU2VsZWN0QWxsQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9IHRoaXMuc2hvdWxkQ29sdW1uU2VsZWN0KGV2ZW50KSA/IFNlbGVjdGlvbk1vZGUuQ09MVU1OIDogU2VsZWN0aW9uTW9kZS5OT1JNQUw7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBuZXcgc2VsZWN0aW9uXG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgaWYgKCF0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBFbnN1cmUgdGhlIGxpbmUgZXhpc3RzXG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmxpbmVzLmdldCh0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFsxXSk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGVhcmx5IGlmIHRoZSBjbGljayBldmVudCBpcyBub3QgaW4gdGhlIGJ1ZmZlciAoZWcuIGluIHNjcm9sbCBiYXIpXG4gICAgaWYgKGxpbmUubGVuZ3RoID09PSB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFswXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBzZWNvbmQgaGFsZiBvZiBhIHdpZGUgY2hhcmFjdGVyLCBhZGp1c3QgdGhlXG4gICAgLy8gc2VsZWN0aW9uIHRvIGNvdmVyIHRoZSB3aG9sZSBjaGFyYWN0ZXJcbiAgICBpZiAobGluZS5oYXNXaWR0aCh0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydFswXSkgPT09IDApIHtcbiAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0WzBdKys7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgZG91YmxlIGNsaWNrLCBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgd29yZC5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZURvdWJsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NlbGVjdFdvcmRBdEN1cnNvcihldmVudCwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLldPUkQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgdHJpcGxlIGNsaWNrLCBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgbGluZSBhbmQgYWN0aXZhdGluZyBsaW5lXG4gICAqIHNlbGVjdCBtb2RlLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlVHJpcGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLl9nZXRNb3VzZUJ1ZmZlckNvb3JkcyhldmVudCk7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgdGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSA9IFNlbGVjdGlvbk1vZGUuTElORTtcbiAgICAgIHRoaXMuX3NlbGVjdExpbmVBdChjb29yZHNbMV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBtYW5hZ2VyIHNob3VsZCBvcGVyYXRlIGluIGNvbHVtbiBzZWxlY3QgbW9kZVxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIG1vdXNlIG9yIGtleWJvYXJkIGV2ZW50XG4gICAqL1xuICBwdWJsaWMgc2hvdWxkQ29sdW1uU2VsZWN0KGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC5hbHRLZXkgJiYgIShCcm93c2VyLmlzTWFjICYmIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMubWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIG1vdXNlbW92ZSBldmVudCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgZG93biwgcmVjb3JkaW5nIHRoZVxuICAgKiBlbmQgb2YgdGhlIHNlbGVjdGlvbiBhbmQgcmVmcmVzaGluZyB0aGUgc2VsZWN0aW9uLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG1vdXNlbW92ZSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZU1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIElmIHRoZSBtb3VzZW1vdmUgbGlzdGVuZXIgaXMgYWN0aXZlIGl0IG1lYW5zIHRoYXQgYSBzZWxlY3Rpb24gaXNcbiAgICAvLyBjdXJyZW50bHkgYmVpbmcgbWFkZSwgd2Ugc2hvdWxkIHN0b3AgcHJvcGFnYXRpb24gdG8gcHJldmVudCBtb3VzZSBldmVudHNcbiAgICAvLyB0byBiZSBzZW50IHRvIHRoZSBwdHkuXG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBEbyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiBzdGFydCwgdGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBmaXJzdFxuICAgIC8vIGNsaWNrIGluIHRoZSB0ZXJtaW5hbCBpcyBhbiBpbmNyZW1lbnRhbCBjbGlja1xuICAgIGlmICghdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWNvcmQgdGhlIHByZXZpb3VzIHBvc2l0aW9uIHNvIHdlIGtub3cgd2hldGhlciB0byByZWRyYXcgdGhlIHNlbGVjdGlvblxuICAgIC8vIGF0IHRoZSBlbmQuXG4gICAgY29uc3QgcHJldmlvdXNTZWxlY3Rpb25FbmQgPSB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPyBbdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdLCB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMV1dIDogbnVsbDtcblxuICAgIC8vIFNldCB0aGUgaW5pdGlhbCBzZWxlY3Rpb24gZW5kIGJhc2VkIG9uIHRoZSBtb3VzZSBjb29yZGluYXRlc1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCA9IHRoaXMuX2dldE1vdXNlQnVmZmVyQ29vcmRzKGV2ZW50KTtcbiAgICBpZiAoIXRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCkge1xuICAgICAgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNlbGVjdCB0aGUgZW50aXJlIGxpbmUgaWYgbGluZSBzZWxlY3QgbW9kZSBpcyBhY3RpdmUuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgPT09IFNlbGVjdGlvbk1vZGUuTElORSkge1xuICAgICAgaWYgKHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSA8IHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0WzFdKSB7XG4gICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLl9hY3RpdmVTZWxlY3Rpb25Nb2RlID09PSBTZWxlY3Rpb25Nb2RlLldPUkQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdFRvV29yZEF0KHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBhbW91bnQgb2Ygc2Nyb2xsaW5nIHRoYXQgd2lsbCBoYXBwZW4uXG4gICAgdGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA9IHRoaXMuX2dldE1vdXNlRXZlbnRTY3JvbGxBbW91bnQoZXZlbnQpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnNvciB3YXMgYWJvdmUgb3IgYmVsb3cgdGhlIHZpZXdwb3J0LCBtYWtlIHN1cmUgaXQncyBhdCB0aGVcbiAgICAvLyBzdGFydCBvciBlbmQgb2YgdGhlIHZpZXdwb3J0IHJlc3BlY3RpdmVseS4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gd2hlblxuICAgIC8vIE5PVCBpbiBjb2x1bW4gc2VsZWN0IG1vZGUuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVNlbGVjdGlvbk1vZGUgIT09IFNlbGVjdGlvbk1vZGUuQ09MVU1OKSB7XG4gICAgICBpZiAodGhpcy5fZHJhZ1Njcm9sbEFtb3VudCA+IDApIHtcbiAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdID0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9kcmFnU2Nyb2xsQW1vdW50IDwgMCkge1xuICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgYSB3aWRlIGNoYXJhY3RlciBpbmNsdWRlIHRoZSBjZWxsIHRvIHRoZSByaWdodCBpbiB0aGVcbiAgICAvLyBzZWxlY3Rpb24uIE5vdGUgdGhhdCBzZWxlY3Rpb25zIGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgbGluZSB3aWxsIG5ldmVyXG4gICAgLy8gaGF2ZSBhIGNoYXJhY3Rlci5cbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcbiAgICBpZiAodGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdIDwgYnVmZmVyLmxpbmVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgbGluZSA9IGJ1ZmZlci5saW5lcy5nZXQodGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdKTtcbiAgICAgIGlmIChsaW5lICYmIGxpbmUuaGFzV2lkdGgodGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdKSA9PT0gMCkge1xuICAgICAgICBpZiAodGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdIDwgdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzBdKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbmx5IGRyYXcgaGVyZSBpZiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuXG4gICAgaWYgKCFwcmV2aW91c1NlbGVjdGlvbkVuZCB8fFxuICAgICAgcHJldmlvdXNTZWxlY3Rpb25FbmRbMF0gIT09IHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFswXSB8fFxuICAgICAgcHJldmlvdXNTZWxlY3Rpb25FbmRbMV0gIT09IHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSkge1xuICAgICAgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdGhhdCBvY2N1cnMgZXZlcnkgRFJBR19TQ1JPTExfSU5URVJWQUwgbXMgdGhhdCBkb2VzIHRoZVxuICAgKiBzY3JvbGxpbmcgb2YgdGhlIHZpZXdwb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBfZHJhZ1Njcm9sbCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZCB8fCAhdGhpcy5fbW9kZWwuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2RyYWdTY3JvbGxBbW91bnQpIHtcbiAgICAgIHRoaXMuX29uUmVxdWVzdFNjcm9sbExpbmVzLmZpcmUoeyBhbW91bnQ6IHRoaXMuX2RyYWdTY3JvbGxBbW91bnQsIHN1cHByZXNzU2Nyb2xsRXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgLy8gUmUtZXZhbHVhdGUgc2VsZWN0aW9uXG4gICAgICAvLyBJZiB0aGUgY3Vyc29yIHdhcyBhYm92ZSBvciBiZWxvdyB0aGUgdmlld3BvcnQsIG1ha2Ugc3VyZSBpdCdzIGF0IHRoZVxuICAgICAgLy8gc3RhcnQgb3IgZW5kIG9mIHRoZSB2aWV3cG9ydCByZXNwZWN0aXZlbHkuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW5cbiAgICAgIC8vIE5PVCBpbiBjb2x1bW4gc2VsZWN0IG1vZGUuXG4gICAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcbiAgICAgIGlmICh0aGlzLl9kcmFnU2Nyb2xsQW1vdW50ID4gMCkge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSAhPT0gU2VsZWN0aW9uTW9kZS5DT0xVTU4pIHtcbiAgICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kWzFdID0gTWF0aC5taW4oYnVmZmVyLnlkaXNwICsgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLCBidWZmZXIubGluZXMubGVuZ3RoIC0gMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlU2VsZWN0aW9uTW9kZSAhPT0gU2VsZWN0aW9uTW9kZS5DT0xVTU4pIHtcbiAgICAgICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmRbMF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvbkVuZFsxXSA9IGJ1ZmZlci55ZGlzcDtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSBtb3VzZXVwIGV2ZW50LCByZW1vdmluZyB0aGUgbW91c2Vkb3duIGxpc3RlbmVycy5cbiAgICogQHBhcmFtIGV2ZW50IFRoZSBtb3VzZXVwIGV2ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFuZGxlTW91c2VVcChldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVFbGFwc2VkID0gZXZlbnQudGltZVN0YW1wIC0gdGhpcy5fbW91c2VEb3duVGltZVN0YW1wO1xuXG4gICAgdGhpcy5fcmVtb3ZlTW91c2VEb3duTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3Rpb25UZXh0Lmxlbmd0aCA8PSAxICYmIHRpbWVFbGFwc2VkIDwgQUxUX0NMSUNLX01PVkVfQ1VSU09SX1RJTUUgJiYgZXZlbnQuYWx0S2V5ICYmIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuYWx0Q2xpY2tNb3Zlc0N1cnNvcikge1xuICAgICAgaWYgKHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlID09PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCkge1xuICAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IHRoaXMuX21vdXNlU2VydmljZS5nZXRDb29yZHMoXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgdGhpcy5fZWxlbWVudCxcbiAgICAgICAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsXG4gICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgICk7XG4gICAgICAgIGlmIChjb29yZGluYXRlcyAmJiBjb29yZGluYXRlc1swXSAhPT0gdW5kZWZpbmVkICYmIGNvb3JkaW5hdGVzWzFdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBzZXF1ZW5jZSA9IG1vdmVUb0NlbGxTZXF1ZW5jZShjb29yZGluYXRlc1swXSAtIDEsIGNvb3JkaW5hdGVzWzFdIC0gMSwgdGhpcy5fYnVmZmVyU2VydmljZSwgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cyk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChzZXF1ZW5jZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fbW9kZWwuZmluYWxTZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBlbmQgPSB0aGlzLl9tb2RlbC5maW5hbFNlbGVjdGlvbkVuZDtcbiAgICBjb25zdCBoYXNTZWxlY3Rpb24gPSAhIXN0YXJ0ICYmICEhZW5kICYmIChzdGFydFswXSAhPT0gZW5kWzBdIHx8IHN0YXJ0WzFdICE9PSBlbmRbMV0pO1xuXG4gICAgaWYgKCFoYXNTZWxlY3Rpb24pIHtcbiAgICAgIGlmICh0aGlzLl9vbGRIYXNTZWxlY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fZmlyZU9uU2VsZWN0aW9uQ2hhbmdlKHN0YXJ0LCBlbmQsIGhhc1NlbGVjdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2FuaXR5IGNoZWNrLCB0aGVzZSBzaG91bGQgbm90IGJlIHVuZGVmaW5lZCBhcyB0aGVyZSBpcyBhIHNlbGVjdGlvblxuICAgIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fb2xkU2VsZWN0aW9uU3RhcnQgfHwgIXRoaXMuX29sZFNlbGVjdGlvbkVuZCB8fCAoXG4gICAgICBzdGFydFswXSAhPT0gdGhpcy5fb2xkU2VsZWN0aW9uU3RhcnRbMF0gfHwgc3RhcnRbMV0gIT09IHRoaXMuX29sZFNlbGVjdGlvblN0YXJ0WzFdIHx8XG4gICAgICBlbmRbMF0gIT09IHRoaXMuX29sZFNlbGVjdGlvbkVuZFswXSB8fCBlbmRbMV0gIT09IHRoaXMuX29sZFNlbGVjdGlvbkVuZFsxXSkpIHtcblxuICAgICAgdGhpcy5fZmlyZU9uU2VsZWN0aW9uQ2hhbmdlKHN0YXJ0LCBlbmQsIGhhc1NlbGVjdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZmlyZU9uU2VsZWN0aW9uQ2hhbmdlKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGhhc1NlbGVjdGlvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX29sZFNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgdGhpcy5fb2xkU2VsZWN0aW9uRW5kID0gZW5kO1xuICAgIHRoaXMuX29sZEhhc1NlbGVjdGlvbiA9IGhhc1NlbGVjdGlvbjtcbiAgICB0aGlzLl9vblNlbGVjdGlvbkNoYW5nZS5maXJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVCdWZmZXJBY3RpdmF0ZShlOiB7YWN0aXZlQnVmZmVyOiBJQnVmZmVyLCBpbmFjdGl2ZUJ1ZmZlcjogSUJ1ZmZlcn0pOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgLy8gT25seSBhZGp1c3QgdGhlIHNlbGVjdGlvbiBvbiB0cmltLCBzaGlmdEVsZW1lbnRzIGlzIHJhcmVseSB1c2VkIChvbmx5IGluXG4gICAgLy8gcmV2ZXJzZUluZGV4KSBhbmQgZGVsZXRlIGluIGEgc3BsaWNlIGlzIG9ubHkgZXZlciB1c2VkIHdoZW4gdGhlIHNhbWVcbiAgICAvLyBudW1iZXIgb2YgZWxlbWVudHMgd2FzIGp1c3QgYWRkZWQuIEdpdmVuIHRoaXMgaXMgY291bGQgYWN0dWFsbHkgYmVcbiAgICAvLyBiZW5lZmljaWFsIHRvIGxlYXZlIHRoZSBzZWxlY3Rpb24gYXMgaXMgZm9yIHRoZXNlIGNhc2VzLlxuICAgIHRoaXMuX3RyaW1MaXN0ZW5lci5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdHJpbUxpc3RlbmVyID0gZS5hY3RpdmVCdWZmZXIubGluZXMub25UcmltKGFtb3VudCA9PiB0aGlzLl9oYW5kbGVUcmltKGFtb3VudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgdmlld3BvcnQgY29sdW1uICgwIHRvIGNvbHMgLSAxKSB0byB0aGUgY2hhcmFjdGVyIGluZGV4IG9uIHRoZVxuICAgKiBidWZmZXIgbGluZSwgdGhlIGxhdHRlciB0YWtlcyBpbnRvIGFjY291bnQgd2lkZSBhbmQgbnVsbCBjaGFyYWN0ZXJzLlxuICAgKiBAcGFyYW0gYnVmZmVyTGluZSBUaGUgYnVmZmVyIGxpbmUgdG8gdXNlLlxuICAgKiBAcGFyYW0geCBUaGUgeCBpbmRleCBpbiB0aGUgYnVmZmVyIGxpbmUgdG8gY29udmVydC5cbiAgICovXG4gIHByaXZhdGUgX2NvbnZlcnRWaWV3cG9ydENvbFRvQ2hhcmFjdGVySW5kZXgoYnVmZmVyTGluZTogSUJ1ZmZlckxpbmUsIHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgbGV0IGNoYXJJbmRleCA9IHg7XG4gICAgZm9yIChsZXQgaSA9IDA7IHggPj0gaTsgaSsrKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBidWZmZXJMaW5lLmxvYWRDZWxsKGksIHRoaXMuX3dvcmtDZWxsKS5nZXRDaGFycygpLmxlbmd0aDtcbiAgICAgIGlmICh0aGlzLl93b3JrQ2VsbC5nZXRXaWR0aCgpID09PSAwKSB7XG4gICAgICAgIC8vIFdpZGUgY2hhcmFjdGVycyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGxpbmUgc3RyaW5nIHNvIGRlY3JlbWVudCB0aGVcbiAgICAgICAgLy8gaW5kZXggc28gdGhlIGluZGV4IGlzIGJhY2sgb24gdGhlIHdpZGUgY2hhcmFjdGVyLlxuICAgICAgICBjaGFySW5kZXgtLTtcbiAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID4gMSAmJiB4ICE9PSBpKSB7XG4gICAgICAgIC8vIEVtb2ppcyB0YWtlIHVwIG11bHRpcGxlIGNoYXJhY3RlcnMsIHNvIGFkanVzdCBhY2NvcmRpbmdseS4gRm9yIHRoZXNlXG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgb3QgaW5jbHVkZSB0aGUgY2hhcmFjdGVyIGF0IHRoZSBjb2x1bW4gYXMgd2UncmVcbiAgICAgICAgLy8gcmV0dXJuaW5nIHRoZSBzdGFydCBpbmRleCBpbiB0aGUgc3RyaW5nLCBub3QgdGhlIGVuZCBpbmRleC5cbiAgICAgICAgY2hhckluZGV4ICs9IGxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGFySW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VsZWN0aW9uKGNvbDogbnVtYmVyLCByb3c6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RlbC5jbGVhclNlbGVjdGlvbigpO1xuICAgIHRoaXMuX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycygpO1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gW2NvbCwgcm93XTtcbiAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25TdGFydExlbmd0aCA9IGxlbmd0aDtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB0aGlzLl9maXJlRXZlbnRJZlNlbGVjdGlvbkNoYW5nZWQoKTtcbiAgfVxuXG4gIHB1YmxpYyByaWdodENsaWNrU2VsZWN0KGV2OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0NsaWNrSW5TZWxlY3Rpb24oZXYpKSB7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0V29yZEF0Q3Vyc29yKGV2LCBmYWxzZSkpIHtcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmlyZUV2ZW50SWZTZWxlY3Rpb25DaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgcG9zaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHdvcmQgYXQgdGhlIGNvb3JkaW5hdGVkIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGNvb3JkcyBUaGUgY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSB3b3JkIGF0LlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0V29yZEF0KGNvb3JkczogW251bWJlciwgbnVtYmVyXSwgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbjogYm9vbGVhbiwgZm9sbG93V3JhcHBlZExpbmVzQWJvdmU6IGJvb2xlYW4gPSB0cnVlLCBmb2xsb3dXcmFwcGVkTGluZXNCZWxvdzogYm9vbGVhbiA9IHRydWUpOiBJV29yZFBvc2l0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBFbnN1cmUgY29vcmRzIGFyZSB3aXRoaW4gdmlld3BvcnQgKGVnLiBub3Qgd2l0aGluIHNjcm9sbCBiYXIpXG4gICAgaWYgKGNvb3Jkc1swXSA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgY29uc3QgYnVmZmVyTGluZSA9IGJ1ZmZlci5saW5lcy5nZXQoY29vcmRzWzFdKTtcbiAgICBpZiAoIWJ1ZmZlckxpbmUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbGluZSA9IGJ1ZmZlci50cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmcoY29vcmRzWzFdLCBmYWxzZSk7XG5cbiAgICAvLyBHZXQgYWN0dWFsIGluZGV4LCB0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIHdpZGUgY2hhcmFjdGVyc1xuICAgIGxldCBzdGFydEluZGV4ID0gdGhpcy5fY29udmVydFZpZXdwb3J0Q29sVG9DaGFyYWN0ZXJJbmRleChidWZmZXJMaW5lLCBjb29yZHNbMF0pO1xuICAgIGxldCBlbmRJbmRleCA9IHN0YXJ0SW5kZXg7XG5cbiAgICAvLyBSZWNvcmQgb2Zmc2V0IHRvIGJlIHVzZWQgbGF0ZXJcbiAgICBjb25zdCBjaGFyT2Zmc2V0ID0gY29vcmRzWzBdIC0gc3RhcnRJbmRleDtcbiAgICBsZXQgbGVmdFdpZGVDaGFyQ291bnQgPSAwO1xuICAgIGxldCByaWdodFdpZGVDaGFyQ291bnQgPSAwO1xuICAgIGxldCBsZWZ0TG9uZ0NoYXJPZmZzZXQgPSAwO1xuICAgIGxldCByaWdodExvbmdDaGFyT2Zmc2V0ID0gMDtcblxuICAgIGlmIChsaW5lLmNoYXJBdChzdGFydEluZGV4KSA9PT0gJyAnKSB7XG4gICAgICAvLyBFeHBhbmQgdW50aWwgbm9uLXdoaXRlc3BhY2UgaXMgaGl0XG4gICAgICB3aGlsZSAoc3RhcnRJbmRleCA+IDAgJiYgbGluZS5jaGFyQXQoc3RhcnRJbmRleCAtIDEpID09PSAnICcpIHtcbiAgICAgICAgc3RhcnRJbmRleC0tO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGVuZEluZGV4IDwgbGluZS5sZW5ndGggJiYgbGluZS5jaGFyQXQoZW5kSW5kZXggKyAxKSA9PT0gJyAnKSB7XG4gICAgICAgIGVuZEluZGV4Kys7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV4cGFuZCB1bnRpbCB3aGl0ZXNwYWNlIGlzIGhpdC4gVGhpcyBhbGdvcml0aG0gd29ya3MgYnkgc2Nhbm5pbmcgbGVmdFxuICAgICAgLy8gYW5kIHJpZ2h0IGZyb20gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uLCBrZWVwaW5nIGJvdGggdGhlIGluZGV4IGZvcm1hdFxuICAgICAgLy8gKGxpbmUpIGFuZCB0aGUgY29sdW1uIGZvcm1hdCAoYnVmZmVyTGluZSkgaW4gc3luYy4gV2hlbiBhIHdpZGVcbiAgICAgIC8vIGNoYXJhY3RlciBpcyBoaXQsIGl0IGlzIHJlY29yZGVkIGFuZCB0aGUgY29sdW1uIGluZGV4IGlzIGFkanVzdGVkLlxuICAgICAgbGV0IHN0YXJ0Q29sID0gY29vcmRzWzBdO1xuICAgICAgbGV0IGVuZENvbCA9IGNvb3Jkc1swXTtcblxuICAgICAgLy8gQ29uc2lkZXIgdGhlIGluaXRpYWwgcG9zaXRpb24sIHNraXAgaXQgYW5kIGluY3JlbWVudCB0aGUgd2lkZSBjaGFyXG4gICAgICAvLyB2YXJpYWJsZVxuICAgICAgaWYgKGJ1ZmZlckxpbmUuZ2V0V2lkdGgoc3RhcnRDb2wpID09PSAwKSB7XG4gICAgICAgIGxlZnRXaWRlQ2hhckNvdW50Kys7XG4gICAgICAgIHN0YXJ0Q29sLS07XG4gICAgICB9XG4gICAgICBpZiAoYnVmZmVyTGluZS5nZXRXaWR0aChlbmRDb2wpID09PSAyKSB7XG4gICAgICAgIHJpZ2h0V2lkZUNoYXJDb3VudCsrO1xuICAgICAgICBlbmRDb2wrKztcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHRoZSBlbmQgaW5kZXggZm9yIGNoYXJhY3RlcnMgd2hvc2UgbGVuZ3RoIGFyZSA+IDEgKGVtb2ppcylcbiAgICAgIGNvbnN0IGxlbmd0aCA9IGJ1ZmZlckxpbmUuZ2V0U3RyaW5nKGVuZENvbCkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEpIHtcbiAgICAgICAgcmlnaHRMb25nQ2hhck9mZnNldCArPSBsZW5ndGggLSAxO1xuICAgICAgICBlbmRJbmRleCArPSBsZW5ndGggLSAxO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHBhbmQgdGhlIHN0cmluZyBpbiBib3RoIGRpcmVjdGlvbnMgdW50aWwgYSBzcGFjZSBpcyBoaXRcbiAgICAgIHdoaWxlIChzdGFydENvbCA+IDAgJiYgc3RhcnRJbmRleCA+IDAgJiYgIXRoaXMuX2lzQ2hhcldvcmRTZXBhcmF0b3IoYnVmZmVyTGluZS5sb2FkQ2VsbChzdGFydENvbCAtIDEsIHRoaXMuX3dvcmtDZWxsKSkpIHtcbiAgICAgICAgYnVmZmVyTGluZS5sb2FkQ2VsbChzdGFydENvbCAtIDEsIHRoaXMuX3dvcmtDZWxsKTtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fd29ya0NlbGwuZ2V0Q2hhcnMoKS5sZW5ndGg7XG4gICAgICAgIGlmICh0aGlzLl93b3JrQ2VsbC5nZXRXaWR0aCgpID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgd2lkZSBjaGFyLCByZWNvcmQgaXQgYW5kIHNraXAgdGhlIGNvbHVtblxuICAgICAgICAgIGxlZnRXaWRlQ2hhckNvdW50Kys7XG4gICAgICAgICAgc3RhcnRDb2wtLTtcbiAgICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIG5leHQgY2hhcmFjdGVyJ3Mgc3RyaW5nIGlzIGxvbmdlciB0aGFuIDEgY2hhciAoZWcuIGVtb2ppKSxcbiAgICAgICAgICAvLyBhZGp1c3QgdGhlIGluZGV4XG4gICAgICAgICAgbGVmdExvbmdDaGFyT2Zmc2V0ICs9IGxlbmd0aCAtIDE7XG4gICAgICAgICAgc3RhcnRJbmRleCAtPSBsZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0SW5kZXgtLTtcbiAgICAgICAgc3RhcnRDb2wtLTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbmRDb2wgPCBidWZmZXJMaW5lLmxlbmd0aCAmJiBlbmRJbmRleCArIDEgPCBsaW5lLmxlbmd0aCAmJiAhdGhpcy5faXNDaGFyV29yZFNlcGFyYXRvcihidWZmZXJMaW5lLmxvYWRDZWxsKGVuZENvbCArIDEsIHRoaXMuX3dvcmtDZWxsKSkpIHtcbiAgICAgICAgYnVmZmVyTGluZS5sb2FkQ2VsbChlbmRDb2wgKyAxLCB0aGlzLl93b3JrQ2VsbCk7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX3dvcmtDZWxsLmdldENoYXJzKCkubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fd29ya0NlbGwuZ2V0V2lkdGgoKSA9PT0gMikge1xuICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBhIHdpZGUgY2hhciwgcmVjb3JkIGl0IGFuZCBza2lwIHRoZSBjb2x1bW5cbiAgICAgICAgICByaWdodFdpZGVDaGFyQ291bnQrKztcbiAgICAgICAgICBlbmRDb2wrKztcbiAgICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIG5leHQgY2hhcmFjdGVyJ3Mgc3RyaW5nIGlzIGxvbmdlciB0aGFuIDEgY2hhciAoZWcuIGVtb2ppKSxcbiAgICAgICAgICAvLyBhZGp1c3QgdGhlIGluZGV4XG4gICAgICAgICAgcmlnaHRMb25nQ2hhck9mZnNldCArPSBsZW5ndGggLSAxO1xuICAgICAgICAgIGVuZEluZGV4ICs9IGxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgZW5kSW5kZXgrKztcbiAgICAgICAgZW5kQ29sKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5jcmVtZW5ldCB0aGUgZW5kIGluZGV4IHNvIGl0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjaGFyYWN0ZXJcbiAgICBlbmRJbmRleCsrO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBzdGFydCBfY29sdW1uXywgY29udmVydGluZyB0aGUgdGhlIHN0cmluZyBpbmRleGVzIGJhY2sgdG9cbiAgICAvLyBjb2x1bW4gY29vcmRpbmF0ZXMuXG4gICAgbGV0IHN0YXJ0ID1cbiAgICAgICAgc3RhcnRJbmRleCAvLyBUaGUgaW5kZXggb2YgdGhlIHNlbGVjdGlvbidzIHN0YXJ0IGNoYXIgaW4gdGhlIGxpbmUgc3RyaW5nXG4gICAgICAgICsgY2hhck9mZnNldCAvLyBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBpbml0aWFsIGNoYXIncyBjb2x1bW4gYW5kIGluZGV4XG4gICAgICAgIC0gbGVmdFdpZGVDaGFyQ291bnQgLy8gVGhlIG51bWJlciBvZiB3aWRlIGNoYXJzIGxlZnQgb2YgdGhlIGluaXRpYWwgY2hhclxuICAgICAgICArIGxlZnRMb25nQ2hhck9mZnNldDsgLy8gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNoYXJzIGxlZnQgb2YgdGhlIGluaXRpYWwgY2hhciBhZGRlZCBieSBjb2x1bW5zIHdpdGggc3RyaW5ncyBsb25nZXIgdGhhbiAxIChlbW9qaXMpXG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBpbiBfY29sdW1uc18sIGNvbnZlcnRpbmcgdGhlIHRoZSBzdHJpbmcgaW5kZXhlcyBiYWNrXG4gICAgLy8gdG8gY29sdW1uIGNvb3JkaW5hdGVzLlxuICAgIGxldCBsZW5ndGggPSBNYXRoLm1pbih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIC8vIERpc2FsbG93IGxlbmd0aHMgbGFyZ2VyIHRoYW4gdGhlIHRlcm1pbmFsIGNvbHNcbiAgICAgIGVuZEluZGV4IC8vIFRoZSBpbmRleCBvZiB0aGUgc2VsZWN0aW9uJ3MgZW5kIGNoYXIgaW4gdGhlIGxpbmUgc3RyaW5nXG4gICAgICAtIHN0YXJ0SW5kZXggLy8gVGhlIGluZGV4IG9mIHRoZSBzZWxlY3Rpb24ncyBzdGFydCBjaGFyIGluIHRoZSBsaW5lIHN0cmluZ1xuICAgICAgKyBsZWZ0V2lkZUNoYXJDb3VudCAvLyBUaGUgbnVtYmVyIG9mIHdpZGUgY2hhcnMgbGVmdCBvZiB0aGUgaW5pdGlhbCBjaGFyXG4gICAgICArIHJpZ2h0V2lkZUNoYXJDb3VudCAvLyBUaGUgbnVtYmVyIG9mIHdpZGUgY2hhcnMgcmlnaHQgb2YgdGhlIGluaXRpYWwgY2hhciAoaW5jbHVzaXZlKVxuICAgICAgLSBsZWZ0TG9uZ0NoYXJPZmZzZXQgLy8gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNoYXJzIGxlZnQgb2YgdGhlIGluaXRpYWwgY2hhciBhZGRlZCBieSBjb2x1bW5zIHdpdGggc3RyaW5ncyBsb25nZXIgdGhhbiAxIChlbW9qaXMpXG4gICAgICAtIHJpZ2h0TG9uZ0NoYXJPZmZzZXQpOyAvLyBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY2hhcnMgcmlnaHQgb2YgdGhlIGluaXRpYWwgY2hhciAoaW5jbHVzaXZlKSBhZGRlZCBieSBjb2x1bW5zIHdpdGggc3RyaW5ncyBsb25nZXIgdGhhbiAxIChlbW9qaXMpXG5cbiAgICBpZiAoIWFsbG93V2hpdGVzcGFjZU9ubHlTZWxlY3Rpb24gJiYgbGluZS5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCkudHJpbSgpID09PSAnJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZWN1cnNlIHVwd2FyZHMgaWYgdGhlIGxpbmUgaXMgd3JhcHBlZCBhbmQgdGhlIHdvcmQgd3JhcHMgdG8gdGhlIGFib3ZlIGxpbmVcbiAgICBpZiAoZm9sbG93V3JhcHBlZExpbmVzQWJvdmUpIHtcbiAgICAgIGlmIChzdGFydCA9PT0gMCAmJiBidWZmZXJMaW5lLmdldENvZGVQb2ludCgwKSAhPT0gMzIgLyogJyAnICovKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQnVmZmVyTGluZSA9IGJ1ZmZlci5saW5lcy5nZXQoY29vcmRzWzFdIC0gMSk7XG4gICAgICAgIGlmIChwcmV2aW91c0J1ZmZlckxpbmUgJiYgYnVmZmVyTGluZS5pc1dyYXBwZWQgJiYgcHJldmlvdXNCdWZmZXJMaW5lLmdldENvZGVQb2ludCh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKSAhPT0gMzIgLyogJyAnICovKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNMaW5lV29yZFBvc2l0aW9uID0gdGhpcy5fZ2V0V29yZEF0KFt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxLCBjb29yZHNbMV0gLSAxXSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICBpZiAocHJldmlvdXNMaW5lV29yZFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSBwcmV2aW91c0xpbmVXb3JkUG9zaXRpb24uc3RhcnQ7XG4gICAgICAgICAgICBzdGFydCAtPSBvZmZzZXQ7XG4gICAgICAgICAgICBsZW5ndGggKz0gb2Zmc2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlY3Vyc2UgZG93bndhcmRzIGlmIHRoZSBsaW5lIGlzIHdyYXBwZWQgYW5kIHRoZSB3b3JkIHdyYXBzIHRvIHRoZSBuZXh0IGxpbmVcbiAgICBpZiAoZm9sbG93V3JhcHBlZExpbmVzQmVsb3cpIHtcbiAgICAgIGlmIChzdGFydCArIGxlbmd0aCA9PT0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzICYmIGJ1ZmZlckxpbmUuZ2V0Q29kZVBvaW50KHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAtIDEpICE9PSAzMiAvKiAnICcgKi8pIHtcbiAgICAgICAgY29uc3QgbmV4dEJ1ZmZlckxpbmUgPSBidWZmZXIubGluZXMuZ2V0KGNvb3Jkc1sxXSArIDEpO1xuICAgICAgICBpZiAobmV4dEJ1ZmZlckxpbmU/LmlzV3JhcHBlZCAmJiBuZXh0QnVmZmVyTGluZS5nZXRDb2RlUG9pbnQoMCkgIT09IDMyIC8qICcgJyAqLykge1xuICAgICAgICAgIGNvbnN0IG5leHRMaW5lV29yZFBvc2l0aW9uID0gdGhpcy5fZ2V0V29yZEF0KFswLCBjb29yZHNbMV0gKyAxXSwgZmFsc2UsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICBpZiAobmV4dExpbmVXb3JkUG9zaXRpb24pIHtcbiAgICAgICAgICAgIGxlbmd0aCArPSBuZXh0TGluZVdvcmRQb3NpdGlvbi5sZW5ndGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgc3RhcnQsIGxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIHdvcmQgYXQgdGhlIGNvb3JkaW5hdGVzIHNwZWNpZmllZC5cbiAgICogQHBhcmFtIGNvb3JkcyBUaGUgY29vcmRpbmF0ZXMgdG8gZ2V0IHRoZSB3b3JkIGF0LlxuICAgKiBAcGFyYW0gYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbiBJZiB3aGl0ZXNwYWNlIHNob3VsZCBiZSBzZWxlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZWxlY3RXb3JkQXQoY29vcmRzOiBbbnVtYmVyLCBudW1iZXJdLCBhbGxvd1doaXRlc3BhY2VPbmx5U2VsZWN0aW9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgd29yZFBvc2l0aW9uID0gdGhpcy5fZ2V0V29yZEF0KGNvb3JkcywgYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbik7XG4gICAgaWYgKHdvcmRQb3NpdGlvbikge1xuICAgICAgLy8gQWRqdXN0IG5lZ2F0aXZlIHN0YXJ0IHZhbHVlXG4gICAgICB3aGlsZSAod29yZFBvc2l0aW9uLnN0YXJ0IDwgMCkge1xuICAgICAgICB3b3JkUG9zaXRpb24uc3RhcnQgKz0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzO1xuICAgICAgICBjb29yZHNbMV0tLTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gW3dvcmRQb3NpdGlvbi5zdGFydCwgY29vcmRzWzFdXTtcbiAgICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0TGVuZ3RoID0gd29yZFBvc2l0aW9uLmxlbmd0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2VsZWN0aW9uIGVuZCB0byB0aGUgd29yZCBhdCB0aGUgY29vcmRpbmF0ZWQgc3BlY2lmaWVkLlxuICAgKiBAcGFyYW0gY29vcmRzIFRoZSBjb29yZGluYXRlcyB0byBnZXQgdGhlIHdvcmQgYXQuXG4gICAqL1xuICBwcml2YXRlIF9zZWxlY3RUb1dvcmRBdChjb29yZHM6IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICBjb25zdCB3b3JkUG9zaXRpb24gPSB0aGlzLl9nZXRXb3JkQXQoY29vcmRzLCB0cnVlKTtcbiAgICBpZiAod29yZFBvc2l0aW9uKSB7XG4gICAgICBsZXQgZW5kUm93ID0gY29vcmRzWzFdO1xuXG4gICAgICAvLyBBZGp1c3QgbmVnYXRpdmUgc3RhcnQgdmFsdWVcbiAgICAgIHdoaWxlICh3b3JkUG9zaXRpb24uc3RhcnQgPCAwKSB7XG4gICAgICAgIHdvcmRQb3NpdGlvbi5zdGFydCArPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHM7XG4gICAgICAgIGVuZFJvdy0tO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGp1c3Qgd3JhcHBlZCBsZW5ndGggdmFsdWUsIHRoaXMgb25seSBuZWVkcyB0byBoYXBwZW4gd2hlbiB2YWx1ZXMgYXJlIHJldmVyc2VkIGFzIGluIHRoYXRcbiAgICAgIC8vIGNhc2Ugd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgc3RhcnQgb2YgdGhlIHdvcmQsIG5vdCB0aGUgZW5kXG4gICAgICBpZiAoIXRoaXMuX21vZGVsLmFyZVNlbGVjdGlvblZhbHVlc1JldmVyc2VkKCkpIHtcbiAgICAgICAgd2hpbGUgKHdvcmRQb3NpdGlvbi5zdGFydCArIHdvcmRQb3NpdGlvbi5sZW5ndGggPiB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgICAgICB3b3JkUG9zaXRpb24ubGVuZ3RoIC09IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICAgICAgICBlbmRSb3crKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9tb2RlbC5zZWxlY3Rpb25FbmQgPSBbdGhpcy5fbW9kZWwuYXJlU2VsZWN0aW9uVmFsdWVzUmV2ZXJzZWQoKSA/IHdvcmRQb3NpdGlvbi5zdGFydCA6IHdvcmRQb3NpdGlvbi5zdGFydCArIHdvcmRQb3NpdGlvbi5sZW5ndGgsIGVuZFJvd107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgd2hldGhlciB0aGUgY2hhcmFjdGVyIGlzIGNvbnNpZGVyZWQgYSB3b3JkIHNlcGFyYXRvciBieSB0aGUgc2VsZWN0XG4gICAqIHdvcmQgbG9naWMuXG4gICAqIEBwYXJhbSBjZWxsIFRoZSBjZWxsIHRvIGNoZWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNDaGFyV29yZFNlcGFyYXRvcihjZWxsOiBDZWxsRGF0YSk6IGJvb2xlYW4ge1xuICAgIC8vIFplcm8gd2lkdGggY2hhcmFjdGVycyBhcmUgbmV2ZXIgc2VwYXJhdG9ycyBhcyB0aGV5IGFyZSBhbHdheXMgdG8gdGhlXG4gICAgLy8gcmlnaHQgb2Ygd2lkZSBjaGFyYWN0ZXJzXG4gICAgaWYgKGNlbGwuZ2V0V2lkdGgoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53b3JkU2VwYXJhdG9yLmluZGV4T2YoY2VsbC5nZXRDaGFycygpKSA+PSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgdGhlIGxpbmUgc3BlY2lmaWVkLlxuICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBpbmRleC5cbiAgICovXG4gIHByb3RlY3RlZCBfc2VsZWN0TGluZUF0KGxpbmU6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHdyYXBwZWRSYW5nZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmdldFdyYXBwZWRSYW5nZUZvckxpbmUobGluZSk7XG4gICAgY29uc3QgcmFuZ2U6IElCdWZmZXJSYW5nZSA9IHtcbiAgICAgIHN0YXJ0OiB7IHg6IDAsIHk6IHdyYXBwZWRSYW5nZS5maXJzdCB9LFxuICAgICAgZW5kOiB7IHg6IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyAtIDEsIHk6IHdyYXBwZWRSYW5nZS5sYXN0IH1cbiAgICB9O1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0ID0gWzAsIHdyYXBwZWRSYW5nZS5maXJzdF07XG4gICAgdGhpcy5fbW9kZWwuc2VsZWN0aW9uRW5kID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX21vZGVsLnNlbGVjdGlvblN0YXJ0TGVuZ3RoID0gZ2V0UmFuZ2VMZW5ndGgocmFuZ2UsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scyk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucywgSVJlbmRlcmVyIH0gZnJvbSAnYnJvd3Nlci9yZW5kZXJlci9zaGFyZWQvVHlwZXMnO1xuaW1wb3J0IHsgSUNvbG9yU2V0LCBJTGluaywgUmVhZG9ubHlDb2xvclNldCB9IGZyb20gJ2Jyb3dzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSVNlbGVjdGlvblJlZHJhd1JlcXVlc3RFdmVudCBhcyBJU2VsZWN0aW9uUmVxdWVzdFJlZHJhd0V2ZW50LCBJU2VsZWN0aW9uUmVxdWVzdFNjcm9sbExpbmVzRXZlbnQgfSBmcm9tICdicm93c2VyL3NlbGVjdGlvbi9UeXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVEZWNvcmF0b3IgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGNvbnN0IElDaGFyU2l6ZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUNoYXJTaXplU2VydmljZT4oJ0NoYXJTaXplU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhclNpemVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGhhc1ZhbGlkU2l6ZTogYm9vbGVhbjtcblxuICByZWFkb25seSBvbkNoYXJTaXplQ2hhbmdlOiBJRXZlbnQ8dm9pZD47XG5cbiAgbWVhc3VyZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVCcm93c2VyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZUJyb3dzZXJTZXJ2aWNlPignQ29yZUJyb3dzZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlQnJvd3NlclNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBpc0ZvY3VzZWQ6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgb25EcHJDaGFuZ2U6IElFdmVudDxudW1iZXI+O1xuICByZWFkb25seSBvbldpbmRvd0NoYW5nZTogSUV2ZW50PFdpbmRvdyAmIHR5cGVvZiBnbG9iYWxUaGlzPjtcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBwYXJlbnQgd2luZG93IHRoYXQgdGhlIHRlcm1pbmFsIGlzIHJlbmRlcmVkIGludG8uIERPTSBhbmQgcmVuZGVyaW5nIEFQSXMgKGUuZy5cbiAgICogcmVxdWVzdEFuaW1hdGlvbkZyYW1lKSBzaG91bGQgYmUgaW52b2tlZCBpbiB0aGUgY29udGV4dCBvZiB0aGlzIHdpbmRvdy4gVGhpcyBzaG91bGQgYmUgc2V0IHdoZW5cbiAgICogdGhlIHdpbmRvdyBob3N0aW5nIHRoZSB4dGVybS5qcyBpbnN0YW5jZSBjaGFuZ2VzLlxuICAgKi9cbiAgd2luZG93OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgLyoqXG4gICAqIFRoZSBkb2N1bWVudCBvZiB0aGUgcHJpbWFyeSB3aW5kb3cgdG8gYmUgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgd2hlbiB3b3JraW5nIHdpdGggbXVsdGlwbGVcbiAgICogd2luZG93cy4gVGhpcyBpcyBkZWZpbmVkIGJ5IHRoZSBkb2N1bWVudE92ZXJyaWRlIHNldHRpbmcuXG4gICAqL1xuICByZWFkb25seSBtYWluRG9jdW1lbnQ6IERvY3VtZW50O1xuICAvKipcbiAgICogSGVscGVyIGZvciBnZXR0aW5nIHRoZSBkZXZpY2VQaXhlbFJhdGlvIG9mIHRoZSBwYXJlbnQgd2luZG93LlxuICAgKi9cbiAgcmVhZG9ubHkgZHByOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBJTW91c2VTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElNb3VzZVNlcnZpY2U+KCdNb3VzZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU1vdXNlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIGdldENvb3JkcyhldmVudDoge2NsaWVudFg6IG51bWJlciwgY2xpZW50WTogbnVtYmVyfSwgZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbENvdW50OiBudW1iZXIsIHJvd0NvdW50OiBudW1iZXIsIGlzU2VsZWN0aW9uPzogYm9vbGVhbik6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIGdldE1vdXNlUmVwb3J0Q29vcmRzKGV2ZW50OiBNb3VzZUV2ZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCk6IHsgY29sOiBudW1iZXIsIHJvdzogbnVtYmVyLCB4OiBudW1iZXIsIHk6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY29uc3QgSVJlbmRlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVJlbmRlclNlcnZpY2U+KCdSZW5kZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElSZW5kZXJTZXJ2aWNlIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBvbkRpbWVuc2lvbnNDaGFuZ2U6IElFdmVudDxJUmVuZGVyRGltZW5zaW9ucz47XG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGJ1ZmZlciBjaGFuZ2VzIGFyZSByZW5kZXJlZC4gVGhpcyBkb2VzIG5vdCBmaXJlIHdoZW4gb25seSBjdXJzb3JcbiAgICogb3Igc2VsZWN0aW9ucyBhcmUgcmVuZGVyZWQuXG4gICAqL1xuICBvblJlbmRlcmVkVmlld3BvcnRDaGFuZ2U6IElFdmVudDx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+O1xuICAvKipcbiAgICogRmlyZXMgb24gcmVuZGVyXG4gICAqL1xuICBvblJlbmRlcjogSUV2ZW50PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT47XG4gIG9uUmVmcmVzaFJlcXVlc3Q6IElFdmVudDx7IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyIH0+O1xuXG4gIGRpbWVuc2lvbnM6IElSZW5kZXJEaW1lbnNpb25zO1xuXG4gIGFkZFJlZnJlc2hDYWxsYmFjayhjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spOiBudW1iZXI7XG5cbiAgcmVmcmVzaFJvd3Moc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkO1xuICBjbGVhclRleHR1cmVBdGxhcygpOiB2b2lkO1xuICByZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICBoYXNSZW5kZXJlcigpOiBib29sZWFuO1xuICBzZXRSZW5kZXJlcihyZW5kZXJlcjogSVJlbmRlcmVyKTogdm9pZDtcbiAgaGFuZGxlRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZSgpOiB2b2lkO1xuICBoYW5kbGVSZXNpemUoY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkO1xuICBoYW5kbGVDaGFyU2l6ZUNoYW5nZWQoKTogdm9pZDtcbiAgaGFuZGxlQmx1cigpOiB2b2lkO1xuICBoYW5kbGVGb2N1cygpOiB2b2lkO1xuICBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKHN0YXJ0OiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBlbmQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQsIGNvbHVtblNlbGVjdE1vZGU6IGJvb2xlYW4pOiB2b2lkO1xuICBoYW5kbGVDdXJzb3JNb3ZlKCk6IHZvaWQ7XG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJU2VsZWN0aW9uU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJU2VsZWN0aW9uU2VydmljZT4oJ1NlbGVjdGlvblNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSVNlbGVjdGlvblNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBzZWxlY3Rpb25UZXh0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhhc1NlbGVjdGlvbjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uU3RhcnQ6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHNlbGVjdGlvbkVuZDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBvbkxpbnV4TW91c2VTZWxlY3Rpb246IElFdmVudDxzdHJpbmc+O1xuICByZWFkb25seSBvblJlcXVlc3RSZWRyYXc6IElFdmVudDxJU2VsZWN0aW9uUmVxdWVzdFJlZHJhd0V2ZW50PjtcbiAgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsTGluZXM6IElFdmVudDxJU2VsZWN0aW9uUmVxdWVzdFNjcm9sbExpbmVzRXZlbnQ+O1xuICByZWFkb25seSBvblNlbGVjdGlvbkNoYW5nZTogSUV2ZW50PHZvaWQ+O1xuXG4gIGRpc2FibGUoKTogdm9pZDtcbiAgZW5hYmxlKCk6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIHNldFNlbGVjdGlvbihyb3c6IG51bWJlciwgY29sOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogdm9pZDtcbiAgc2VsZWN0QWxsKCk6IHZvaWQ7XG4gIHNlbGVjdExpbmVzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZDtcbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZDtcbiAgcmlnaHRDbGlja1NlbGVjdChldmVudDogTW91c2VFdmVudCk6IHZvaWQ7XG4gIHNob3VsZENvbHVtblNlbGVjdChldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiBib29sZWFuO1xuICBzaG91bGRGb3JjZVNlbGVjdGlvbihldmVudDogTW91c2VFdmVudCk6IGJvb2xlYW47XG4gIHJlZnJlc2goaXNMaW51eE1vdXNlU2VsZWN0aW9uPzogYm9vbGVhbik6IHZvaWQ7XG4gIGhhbmRsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQ7XG4gIGlzQ2VsbEluU2VsZWN0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDaGFyYWN0ZXJKb2luZXJTZXJ2aWNlPignQ2hhcmFjdGVySm9pbmVyU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhcmFjdGVySm9pbmVyU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHJlZ2lzdGVyKGhhbmRsZXI6ICh0ZXh0OiBzdHJpbmcpID0+IFtudW1iZXIsIG51bWJlcl1bXSk6IG51bWJlcjtcbiAgZGVyZWdpc3Rlcihqb2luZXJJZDogbnVtYmVyKTogYm9vbGVhbjtcbiAgZ2V0Sm9pbmVkQ2hhcmFjdGVycyhyb3c6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl1bXTtcbn1cblxuZXhwb3J0IGNvbnN0IElUaGVtZVNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SVRoZW1lU2VydmljZT4oJ1RoZW1lU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJVGhlbWVTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgY29sb3JzOiBSZWFkb25seUNvbG9yU2V0O1xuXG4gIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzOiBJRXZlbnQ8UmVhZG9ubHlDb2xvclNldD47XG5cbiAgcmVzdG9yZUNvbG9yKHNsb3Q/OiBBbGxDb2xvckluZGV4KTogdm9pZDtcbiAgLyoqXG4gICAqIEFsbG93cyBleHRlcm5hbCBtb2RpZnlpbmcgb2YgY29sb3JzIGluIHRoZSB0aGVtZSwgdGhpcyBpcyB1c2VkIGluc3RlYWQgb2Yge0BsaW5rIGNvbG9yc30gdG9cbiAgICogcHJldmVudCBhY2NpZGVudGFsIHdyaXRlcy5cbiAgICovXG4gIG1vZGlmeUNvbG9ycyhjYWxsYmFjazogKGNvbG9yczogSUNvbG9yU2V0KSA9PiB2b2lkKTogdm9pZDtcbn1cblxuXG5leHBvcnQgY29uc3QgSUxpbmtQcm92aWRlclNlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUxpbmtQcm92aWRlclNlcnZpY2U+KCdMaW5rUHJvdmlkZXJTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElMaW5rUHJvdmlkZXJTZXJ2aWNlIGV4dGVuZHMgSURpc3Bvc2FibGUge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgbGlua1Byb3ZpZGVyczogUmVhZG9ubHlBcnJheTxJTGlua1Byb3ZpZGVyPjtcbiAgcmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyOiBJTGlua1Byb3ZpZGVyKTogSURpc3Bvc2FibGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIElMaW5rUHJvdmlkZXIge1xuICBwcm92aWRlTGlua3MoeTogbnVtYmVyLCBjYWxsYmFjazogKGxpbmtzOiBJTGlua1tdIHwgdW5kZWZpbmVkKSA9PiB2b2lkKTogdm9pZDtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQ29sb3JDb250cmFzdENhY2hlIH0gZnJvbSAnYnJvd3Nlci9Db2xvckNvbnRyYXN0Q2FjaGUnO1xuaW1wb3J0IHsgSVRoZW1lU2VydmljZSB9IGZyb20gJ2Jyb3dzZXIvc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSUNvbG9yQ29udHJhc3RDYWNoZSwgSUNvbG9yU2V0LCBSZWFkb25seUNvbG9yU2V0IH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBjaGFubmVscywgY29sb3IsIGNzcywgTlVMTF9DT0xPUiB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElPcHRpb25zU2VydmljZSwgSVRoZW1lIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IEFsbENvbG9ySW5kZXgsIElDb2xvciwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSVJlc3RvcmVDb2xvclNldCB7XG4gIGZvcmVncm91bmQ6IElDb2xvcjtcbiAgYmFja2dyb3VuZDogSUNvbG9yO1xuICBjdXJzb3I6IElDb2xvcjtcbiAgYW5zaTogSUNvbG9yW107XG59XG5cblxuY29uc3QgREVGQVVMVF9GT1JFR1JPVU5EID0gY3NzLnRvQ29sb3IoJyNmZmZmZmYnKTtcbmNvbnN0IERFRkFVTFRfQkFDS0dST1VORCA9IGNzcy50b0NvbG9yKCcjMDAwMDAwJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUiA9IGNzcy50b0NvbG9yKCcjZmZmZmZmJyk7XG5jb25zdCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQgPSBjc3MudG9Db2xvcignIzAwMDAwMCcpO1xuY29uc3QgREVGQVVMVF9TRUxFQ1RJT04gPSB7XG4gIGNzczogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4zKScsXG4gIHJnYmE6IDB4RkZGRkZGNERcbn07XG5cbi8vIEFuIElJRkUgdG8gZ2VuZXJhdGUgREVGQVVMVF9BTlNJX0NPTE9SUy5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOU0lfQ09MT1JTID0gT2JqZWN0LmZyZWV6ZSgoKCkgPT4ge1xuICBjb25zdCBjb2xvcnMgPSBbXG4gICAgLy8gZGFyazpcbiAgICBjc3MudG9Db2xvcignIzJlMzQzNicpLFxuICAgIGNzcy50b0NvbG9yKCcjY2MwMDAwJyksXG4gICAgY3NzLnRvQ29sb3IoJyM0ZTlhMDYnKSxcbiAgICBjc3MudG9Db2xvcignI2M0YTAwMCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzQ2NWE0JyksXG4gICAgY3NzLnRvQ29sb3IoJyM3NTUwN2InKSxcbiAgICBjc3MudG9Db2xvcignIzA2OTg5YScpLFxuICAgIGNzcy50b0NvbG9yKCcjZDNkN2NmJyksXG4gICAgLy8gYnJpZ2h0OlxuICAgIGNzcy50b0NvbG9yKCcjNTU1NzUzJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZjI5MjknKSxcbiAgICBjc3MudG9Db2xvcignIzhhZTIzNCcpLFxuICAgIGNzcy50b0NvbG9yKCcjZmNlOTRmJyksXG4gICAgY3NzLnRvQ29sb3IoJyM3MjlmY2YnKSxcbiAgICBjc3MudG9Db2xvcignI2FkN2ZhOCcpLFxuICAgIGNzcy50b0NvbG9yKCcjMzRlMmUyJyksXG4gICAgY3NzLnRvQ29sb3IoJyNlZWVlZWMnKVxuICBdO1xuXG4gIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyAyNDAgQU5TSSBjb2xvcnMuXG4gIC8vIEdlbmVyYXRlIGNvbG9ycyAoMTYtMjMxKVxuICBjb25zdCB2ID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgY29uc3QgciA9IHZbKGkgLyAzNikgJSA2IHwgMF07XG4gICAgY29uc3QgZyA9IHZbKGkgLyA2KSAlIDYgfCAwXTtcbiAgICBjb25zdCBiID0gdltpICUgNl07XG4gICAgY29sb3JzLnB1c2goe1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiKVxuICAgIH0pO1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgZ3JleXMgKDIzMi0yNTUpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgIGNvbnN0IGMgPSA4ICsgaSAqIDEwO1xuICAgIGNvbG9ycy5wdXNoKHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoYywgYywgYyksXG4gICAgICByZ2JhOiBjaGFubmVscy50b1JnYmEoYywgYywgYylcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb2xvcnM7XG59KSgpKTtcblxuZXhwb3J0IGNsYXNzIFRoZW1lU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGhlbWVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgX2NvbG9yczogSUNvbG9yU2V0O1xuICBwcml2YXRlIF9jb250cmFzdENhY2hlOiBJQ29sb3JDb250cmFzdENhY2hlID0gbmV3IENvbG9yQ29udHJhc3RDYWNoZSgpO1xuICBwcml2YXRlIF9oYWxmQ29udHJhc3RDYWNoZTogSUNvbG9yQ29udHJhc3RDYWNoZSA9IG5ldyBDb2xvckNvbnRyYXN0Q2FjaGUoKTtcbiAgcHJpdmF0ZSBfcmVzdG9yZUNvbG9ycyE6IElSZXN0b3JlQ29sb3JTZXQ7XG5cbiAgcHVibGljIGdldCBjb2xvcnMoKTogUmVhZG9ubHlDb2xvclNldCB7IHJldHVybiB0aGlzLl9jb2xvcnM7IH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkNoYW5nZUNvbG9ycyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxSZWFkb25seUNvbG9yU2V0PigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ2hhbmdlQ29sb3JzID0gdGhpcy5fb25DaGFuZ2VDb2xvcnMuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBERUZBVUxUX0ZPUkVHUk9VTkQsXG4gICAgICBiYWNrZ3JvdW5kOiBERUZBVUxUX0JBQ0tHUk9VTkQsXG4gICAgICBjdXJzb3I6IERFRkFVTFRfQ1VSU09SLFxuICAgICAgY3Vyc29yQWNjZW50OiBERUZBVUxUX0NVUlNPUl9BQ0NFTlQsXG4gICAgICBzZWxlY3Rpb25Gb3JlZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQ6IERFRkFVTFRfU0VMRUNUSU9OLFxuICAgICAgc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZTogY29sb3IuYmxlbmQoREVGQVVMVF9CQUNLR1JPVU5ELCBERUZBVUxUX1NFTEVDVElPTiksXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudDogREVGQVVMVF9TRUxFQ1RJT04sXG4gICAgICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRPcGFxdWU6IGNvbG9yLmJsZW5kKERFRkFVTFRfQkFDS0dST1VORCwgREVGQVVMVF9TRUxFQ1RJT04pLFxuICAgICAgYW5zaTogREVGQVVMVF9BTlNJX0NPTE9SUy5zbGljZSgpLFxuICAgICAgY29udHJhc3RDYWNoZTogdGhpcy5fY29udHJhc3RDYWNoZSxcbiAgICAgIGhhbGZDb250cmFzdENhY2hlOiB0aGlzLl9oYWxmQ29udHJhc3RDYWNoZVxuICAgIH07XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX3NldFRoZW1lKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGhlbWUpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdtaW5pbXVtQ29udHJhc3RSYXRpbycsICgpID0+IHRoaXMuX2NvbnRyYXN0Q2FjaGUuY2xlYXIoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgndGhlbWUnLCAoKSA9PiB0aGlzLl9zZXRUaGVtZSh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRoZW1lKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRlcm1pbmFsJ3MgdGhlbWUuXG4gICAqIEBwYXJhbSB0aGVtZSBUaGUgIHRoZW1lIHRvIHVzZS4gSWYgYSBwYXJ0aWFsIHRoZW1lIGlzIHByb3ZpZGVkIHRoZW4gZGVmYXVsdFxuICAgKiBjb2xvcnMgd2lsbCBiZSB1c2VkIHdoZXJlIGNvbG9ycyBhcmUgbm90IGRlZmluZWQuXG4gICAqL1xuICBwcml2YXRlIF9zZXRUaGVtZSh0aGVtZTogSVRoZW1lID0ge30pOiB2b2lkIHtcbiAgICBjb25zdCBjb2xvcnMgPSB0aGlzLl9jb2xvcnM7XG4gICAgY29sb3JzLmZvcmVncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmZvcmVncm91bmQsIERFRkFVTFRfRk9SRUdST1VORCk7XG4gICAgY29sb3JzLmJhY2tncm91bmQgPSBwYXJzZUNvbG9yKHRoZW1lLmJhY2tncm91bmQsIERFRkFVTFRfQkFDS0dST1VORCk7XG4gICAgY29sb3JzLmN1cnNvciA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yLCBERUZBVUxUX0NVUlNPUik7XG4gICAgY29sb3JzLmN1cnNvckFjY2VudCA9IHBhcnNlQ29sb3IodGhlbWUuY3Vyc29yQWNjZW50LCBERUZBVUxUX0NVUlNPUl9BQ0NFTlQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkJhY2tncm91bmQsIERFRkFVTFRfU0VMRUNUSU9OKTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50KTtcbiAgICBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQgPSBwYXJzZUNvbG9yKHRoZW1lLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCwgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCk7XG4gICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSA9IGNvbG9yLmJsZW5kKGNvbG9ycy5iYWNrZ3JvdW5kLCBjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpO1xuICAgIGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID0gdGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCA/IHBhcnNlQ29sb3IodGhlbWUuc2VsZWN0aW9uRm9yZWdyb3VuZCwgTlVMTF9DT0xPUikgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbG9ycy5zZWxlY3Rpb25Gb3JlZ3JvdW5kID09PSBOVUxMX0NPTE9SKSB7XG4gICAgICBjb2xvcnMuc2VsZWN0aW9uRm9yZWdyb3VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJZiBzZWxlY3Rpb24gY29sb3IgaXMgb3BhcXVlLCBibGVuZCBpdCB3aXRoIGJhY2tncm91bmQgd2l0aCAwLjMgb3BhY2l0eVxuICAgICAqIElzc3VlICMyNzM3XG4gICAgICovXG4gICAgaWYgKGNvbG9yLmlzT3BhcXVlKGNvbG9ycy5zZWxlY3Rpb25CYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCA9IGNvbG9yLm9wYWNpdHkoY29sb3JzLnNlbGVjdGlvbkJhY2tncm91bmRUcmFuc3BhcmVudCwgb3BhY2l0eSk7XG4gICAgfVxuICAgIGlmIChjb2xvci5pc09wYXF1ZShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQpKSB7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gMC4zO1xuICAgICAgY29sb3JzLnNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZFRyYW5zcGFyZW50ID0gY29sb3Iub3BhY2l0eShjb2xvcnMuc2VsZWN0aW9uSW5hY3RpdmVCYWNrZ3JvdW5kVHJhbnNwYXJlbnQsIG9wYWNpdHkpO1xuICAgIH1cbiAgICBjb2xvcnMuYW5zaSA9IERFRkFVTFRfQU5TSV9DT0xPUlMuc2xpY2UoKTtcbiAgICBjb2xvcnMuYW5zaVswXSA9IHBhcnNlQ29sb3IodGhlbWUuYmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbMF0pO1xuICAgIGNvbG9ycy5hbnNpWzFdID0gcGFyc2VDb2xvcih0aGVtZS5yZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbMV0pO1xuICAgIGNvbG9ycy5hbnNpWzJdID0gcGFyc2VDb2xvcih0aGVtZS5ncmVlbiwgREVGQVVMVF9BTlNJX0NPTE9SU1syXSk7XG4gICAgY29sb3JzLmFuc2lbM10gPSBwYXJzZUNvbG9yKHRoZW1lLnllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1szXSk7XG4gICAgY29sb3JzLmFuc2lbNF0gPSBwYXJzZUNvbG9yKHRoZW1lLmJsdWUsIERFRkFVTFRfQU5TSV9DT0xPUlNbNF0pO1xuICAgIGNvbG9ycy5hbnNpWzVdID0gcGFyc2VDb2xvcih0aGVtZS5tYWdlbnRhLCBERUZBVUxUX0FOU0lfQ09MT1JTWzVdKTtcbiAgICBjb2xvcnMuYW5zaVs2XSA9IHBhcnNlQ29sb3IodGhlbWUuY3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1s2XSk7XG4gICAgY29sb3JzLmFuc2lbN10gPSBwYXJzZUNvbG9yKHRoZW1lLndoaXRlLCBERUZBVUxUX0FOU0lfQ09MT1JTWzddKTtcbiAgICBjb2xvcnMuYW5zaVs4XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0QmxhY2ssIERFRkFVTFRfQU5TSV9DT0xPUlNbOF0pO1xuICAgIGNvbG9ycy5hbnNpWzldID0gcGFyc2VDb2xvcih0aGVtZS5icmlnaHRSZWQsIERFRkFVTFRfQU5TSV9DT0xPUlNbOV0pO1xuICAgIGNvbG9ycy5hbnNpWzEwXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0R3JlZW4sIERFRkFVTFRfQU5TSV9DT0xPUlNbMTBdKTtcbiAgICBjb2xvcnMuYW5zaVsxMV0gPSBwYXJzZUNvbG9yKHRoZW1lLmJyaWdodFllbGxvdywgREVGQVVMVF9BTlNJX0NPTE9SU1sxMV0pO1xuICAgIGNvbG9ycy5hbnNpWzEyXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Qmx1ZSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxMl0pO1xuICAgIGNvbG9ycy5hbnNpWzEzXSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0TWFnZW50YSwgREVGQVVMVF9BTlNJX0NPTE9SU1sxM10pO1xuICAgIGNvbG9ycy5hbnNpWzE0XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0Q3lhbiwgREVGQVVMVF9BTlNJX0NPTE9SU1sxNF0pO1xuICAgIGNvbG9ycy5hbnNpWzE1XSA9IHBhcnNlQ29sb3IodGhlbWUuYnJpZ2h0V2hpdGUsIERFRkFVTFRfQU5TSV9DT0xPUlNbMTVdKTtcbiAgICBpZiAodGhlbWUuZXh0ZW5kZWRBbnNpKSB7XG4gICAgICBjb25zdCBjb2xvckNvdW50ID0gTWF0aC5taW4oY29sb3JzLmFuc2kubGVuZ3RoIC0gMTYsIHRoZW1lLmV4dGVuZGVkQW5zaS5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xvckNvdW50OyBpKyspIHtcbiAgICAgICAgY29sb3JzLmFuc2lbaSArIDE2XSA9IHBhcnNlQ29sb3IodGhlbWUuZXh0ZW5kZWRBbnNpW2ldLCBERUZBVUxUX0FOU0lfQ09MT1JTW2kgKyAxNl0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDbGVhciBvdXIgdGhlIGNhY2hlXG4gICAgdGhpcy5fY29udHJhc3RDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMuX2hhbGZDb250cmFzdENhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fdXBkYXRlUmVzdG9yZUNvbG9ycygpO1xuICAgIHRoaXMuX29uQ2hhbmdlQ29sb3JzLmZpcmUodGhpcy5jb2xvcnMpO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVDb2xvcihzbG90PzogQWxsQ29sb3JJbmRleCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcihzbG90KTtcbiAgICB0aGlzLl9vbkNoYW5nZUNvbG9ycy5maXJlKHRoaXMuY29sb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc3RvcmVDb2xvcihzbG90OiBBbGxDb2xvckluZGV4IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gdW5zZXQgc2xvdCByZXN0b3JlcyBhbGwgYW5zaSBjb2xvcnNcbiAgICBpZiAoc2xvdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaS5sZW5ndGg7ICsraSkge1xuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtpXSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoIChzbG90KSB7XG4gICAgICBjYXNlIFNwZWNpYWxDb2xvckluZGV4LkZPUkVHUk9VTkQ6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5mb3JlZ3JvdW5kID0gdGhpcy5fcmVzdG9yZUNvbG9ycy5mb3JlZ3JvdW5kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORDpcbiAgICAgICAgdGhpcy5fY29sb3JzLmJhY2tncm91bmQgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmJhY2tncm91bmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1I6XG4gICAgICAgIHRoaXMuX2NvbG9ycy5jdXJzb3IgPSB0aGlzLl9yZXN0b3JlQ29sb3JzLmN1cnNvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9jb2xvcnMuYW5zaVtzbG90XSA9IHRoaXMuX3Jlc3RvcmVDb2xvcnMuYW5zaVtzbG90XTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5Q29sb3JzKGNhbGxiYWNrOiAoY29sb3JzOiBJQ29sb3JTZXQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjayh0aGlzLl9jb2xvcnMpO1xuICAgIC8vIEFzc3VtZSB0aGUgY2hhbmdlIGhhcHBlbmVkXG4gICAgdGhpcy5fb25DaGFuZ2VDb2xvcnMuZmlyZSh0aGlzLmNvbG9ycyk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVSZXN0b3JlQ29sb3JzKCk6IHZvaWQge1xuICAgIHRoaXMuX3Jlc3RvcmVDb2xvcnMgPSB7XG4gICAgICBmb3JlZ3JvdW5kOiB0aGlzLl9jb2xvcnMuZm9yZWdyb3VuZCxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuX2NvbG9ycy5iYWNrZ3JvdW5kLFxuICAgICAgY3Vyc29yOiB0aGlzLl9jb2xvcnMuY3Vyc29yLFxuICAgICAgYW5zaTogdGhpcy5fY29sb3JzLmFuc2kuc2xpY2UoKVxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDb2xvcihcbiAgY3NzU3RyaW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrOiBJQ29sb3Jcbik6IElDb2xvciB7XG4gIGlmIChjc3NTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY3NzLnRvQ29sb3IoY3NzU3RyaW5nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIG5vLW9wXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNpcmN1bGFyTGlzdCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcblxuZXhwb3J0IGludGVyZmFjZSBJSW5zZXJ0RXZlbnQge1xuICBpbmRleDogbnVtYmVyO1xuICBhbW91bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVsZXRlRXZlbnQge1xuICBpbmRleDogbnVtYmVyO1xuICBhbW91bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY2lyY3VsYXIgbGlzdDsgYSBsaXN0IHdpdGggYSBtYXhpbXVtIHNpemUgdGhhdCB3cmFwcyBhcm91bmQgd2hlbiBwdXNoIGlzIGNhbGxlZCxcbiAqIG92ZXJyaWRpbmcgdmFsdWVzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGlzdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENpcmN1bGFyTGlzdDxUPiBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJQ2lyY3VsYXJMaXN0PFQ+IHtcbiAgcHJvdGVjdGVkIF9hcnJheTogKFQgfCB1bmRlZmluZWQpW107XG4gIHByaXZhdGUgX3N0YXJ0SW5kZXg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXI7XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uRGVsZXRlRW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJRGVsZXRlRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EZWxldGUgPSB0aGlzLm9uRGVsZXRlRW1pdHRlci5ldmVudDtcbiAgcHVibGljIHJlYWRvbmx5IG9uSW5zZXJ0RW1pdHRlciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJSW5zZXJ0RXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25JbnNlcnQgPSB0aGlzLm9uSW5zZXJ0RW1pdHRlci5ldmVudDtcbiAgcHVibGljIHJlYWRvbmx5IG9uVHJpbUVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uVHJpbSA9IHRoaXMub25UcmltRW1pdHRlci5ldmVudDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlclxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2FycmF5ID0gbmV3IEFycmF5PFQ+KHRoaXMuX21heExlbmd0aCk7XG4gICAgdGhpcy5fc3RhcnRJbmRleCA9IDA7XG4gICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX21heExlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgbWF4TGVuZ3RoKG5ld01heExlbmd0aDogbnVtYmVyKSB7XG4gICAgLy8gVGhlcmUgd2FzIG5vIGNoYW5nZSBpbiBtYXhMZW5ndGgsIHJldHVybiBlYXJseS5cbiAgICBpZiAodGhpcy5fbWF4TGVuZ3RoID09PSBuZXdNYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBSZWNvbnN0cnVjdCBhcnJheSwgc3RhcnRpbmcgYXQgaW5kZXggMC4gT25seSB0cmFuc2ZlciB2YWx1ZXMgZnJvbSB0aGVcbiAgICAvLyBpbmRleGVzIDAgdG8gbGVuZ3RoLlxuICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5PFQgfCB1bmRlZmluZWQ+KG5ld01heExlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihuZXdNYXhMZW5ndGgsIHRoaXMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICBuZXdBcnJheVtpXSA9IHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkpXTtcbiAgICB9XG4gICAgdGhpcy5fYXJyYXkgPSBuZXdBcnJheTtcbiAgICB0aGlzLl9tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGg7XG4gICAgdGhpcy5fc3RhcnRJbmRleCA9IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGxlbmd0aChuZXdMZW5ndGg6IG51bWJlcikge1xuICAgIGlmIChuZXdMZW5ndGggPiB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSB0aGlzLl9sZW5ndGg7IGkgPCBuZXdMZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLl9hcnJheVtpXSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbGVuZ3RoID0gbmV3TGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGF0IGFuIGluZGV4LlxuICAgKlxuICAgKiBOb3RlIHRoYXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhlcmUgaXMgbm8gYm91bmRzIGNoZWNraW5nIGhlcmUsIHRoZSBpbmRleCByZWZlcmVuY2UgaXNcbiAgICogY2lyY3VsYXIgc28gdGhpcyBzaG91bGQgYWx3YXlzIHJldHVybiBhIHZhbHVlIGFuZCBuZXZlciB0aHJvdy5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXguXG4gICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaW5kZXgpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBhbiBpbmRleC5cbiAgICpcbiAgICogTm90ZSB0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoZXJlIGlzIG5vIGJvdW5kcyBjaGVja2luZyBoZXJlLCB0aGUgaW5kZXggcmVmZXJlbmNlIGlzXG4gICAqIGNpcmN1bGFyIHNvIHRoaXMgc2hvdWxkIGFsd2F5cyByZXR1cm4gYSB2YWx1ZSBhbmQgbmV2ZXIgdGhyb3cuXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdG8gc2V0LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHB1YmxpYyBzZXQoaW5kZXg6IG51bWJlciwgdmFsdWU6IFQgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpbmRleCldID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIGEgbmV3IHZhbHVlIG9udG8gdGhlIGxpc3QsIHdyYXBwaW5nIGFyb3VuZCB0byB0aGUgc3RhcnQgb2YgdGhlIGFycmF5LCBvdmVycmlkaW5nIGluZGV4IDBcbiAgICogaWYgdGhlIG1heGltdW0gbGVuZ3RoIGlzIHJlYWNoZWQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHVzaCBvbnRvIHRoZSBsaXN0LlxuICAgKi9cbiAgcHVibGljIHB1c2godmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0aGlzLl9sZW5ndGgpXSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLl9sZW5ndGggPT09IHRoaXMuX21heExlbmd0aCkge1xuICAgICAgdGhpcy5fc3RhcnRJbmRleCA9ICsrdGhpcy5fc3RhcnRJbmRleCAlIHRoaXMuX21heExlbmd0aDtcbiAgICAgIHRoaXMub25UcmltRW1pdHRlci5maXJlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sZW5ndGgrKztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWR2YW5jZSByaW5nYnVmZmVyIGluZGV4IGFuZCByZXR1cm4gY3VycmVudCBlbGVtZW50IGZvciByZWN5Y2xpbmcuXG4gICAqIE5vdGU6IFRoZSBidWZmZXIgbXVzdCBiZSBmdWxsIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrLlxuICAgKiBAdGhyb3dzIFdoZW4gdGhlIGJ1ZmZlciBpcyBub3QgZnVsbC5cbiAgICovXG4gIHB1YmxpYyByZWN5Y2xlKCk6IFQge1xuICAgIGlmICh0aGlzLl9sZW5ndGggIT09IHRoaXMuX21heExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gb25seSByZWN5Y2xlIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsJyk7XG4gICAgfVxuICAgIHRoaXMuX3N0YXJ0SW5kZXggPSArK3RoaXMuX3N0YXJ0SW5kZXggJSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgdGhpcy5vblRyaW1FbWl0dGVyLmZpcmUoMSk7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHRoaXMuX2xlbmd0aCAtIDEpXSE7XG4gIH1cblxuICAvKipcbiAgICogUmluZ2J1ZmZlciBpcyBhdCBtYXggbGVuZ3RoLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0Z1bGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2xlbmd0aCA9PT0gdGhpcy5fbWF4TGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgb24gdGhlIGxpc3QuXG4gICAqIEByZXR1cm5zIFRoZSBwb3BwZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgcG9wKCk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0aGlzLl9sZW5ndGgtLSAtIDEpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuZC9vciBpbnNlcnRzIGl0ZW1zIGF0IGEgcGFydGljdWxhciBpbmRleCAoaW4gdGhhdCBvcmRlcikuIFVubGlrZVxuICAgKiBBcnJheS5wcm90b3R5cGUuc3BsaWNlLCB0aGlzIG9wZXJhdGlvbiBkb2VzIG5vdCByZXR1cm4gdGhlIGRlbGV0ZWQgaXRlbXMgYXMgYSBuZXcgYXJyYXkgaW5cbiAgICogb3JkZXIgdG8gc2F2ZSBjcmVhdGluZyBhIG5ldyBhcnJheS4gTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIG1heSBzaGlmdCBhbGwgdmFsdWVzIGluIHRoZSBsaXN0XG4gICAqIGluIHRoZSB3b3JzdCBjYXNlLlxuICAgKiBAcGFyYW0gc3RhcnQgVGhlIGluZGV4IHRvIGRlbGV0ZSBhbmQvb3IgaW5zZXJ0LlxuICAgKiBAcGFyYW0gZGVsZXRlQ291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgdG8gaW5zZXJ0LlxuICAgKi9cbiAgcHVibGljIHNwbGljZShzdGFydDogbnVtYmVyLCBkZWxldGVDb3VudDogbnVtYmVyLCAuLi5pdGVtczogVFtdKTogdm9pZCB7XG4gICAgLy8gRGVsZXRlIGl0ZW1zXG4gICAgaWYgKGRlbGV0ZUNvdW50KSB7XG4gICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCB0aGlzLl9sZW5ndGggLSBkZWxldGVDb3VudDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkpXSA9IHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkgKyBkZWxldGVDb3VudCldO1xuICAgICAgfVxuICAgICAgdGhpcy5fbGVuZ3RoIC09IGRlbGV0ZUNvdW50O1xuICAgICAgdGhpcy5vbkRlbGV0ZUVtaXR0ZXIuZmlyZSh7IGluZGV4OiBzdGFydCwgYW1vdW50OiBkZWxldGVDb3VudCB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgaXRlbXNcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fbGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgaS0tKSB7XG4gICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpICsgaXRlbXMubGVuZ3RoKV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV07XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHN0YXJ0ICsgaSldID0gaXRlbXNbaV07XG4gICAgfVxuICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMub25JbnNlcnRFbWl0dGVyLmZpcmUoeyBpbmRleDogc3RhcnQsIGFtb3VudDogaXRlbXMubGVuZ3RoIH0pO1xuICAgIH1cblxuICAgIC8vIEFkanVzdCBsZW5ndGggYXMgbmVlZGVkXG4gICAgaWYgKHRoaXMuX2xlbmd0aCArIGl0ZW1zLmxlbmd0aCA+IHRoaXMuX21heExlbmd0aCkge1xuICAgICAgY29uc3QgY291bnRUb1RyaW0gPSAodGhpcy5fbGVuZ3RoICsgaXRlbXMubGVuZ3RoKSAtIHRoaXMuX21heExlbmd0aDtcbiAgICAgIHRoaXMuX3N0YXJ0SW5kZXggKz0gY291bnRUb1RyaW07XG4gICAgICB0aGlzLl9sZW5ndGggPSB0aGlzLl9tYXhMZW5ndGg7XG4gICAgICB0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZShjb3VudFRvVHJpbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xlbmd0aCArPSBpdGVtcy5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaW1zIGEgbnVtYmVyIG9mIGl0ZW1zIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBpdGVtcyB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgdHJpbVN0YXJ0KGNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY291bnQgPiB0aGlzLl9sZW5ndGgpIHtcbiAgICAgIGNvdW50ID0gdGhpcy5fbGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLl9zdGFydEluZGV4ICs9IGNvdW50O1xuICAgIHRoaXMuX2xlbmd0aCAtPSBjb3VudDtcbiAgICB0aGlzLm9uVHJpbUVtaXR0ZXIuZmlyZShjb3VudCk7XG4gIH1cblxuICBwdWJsaWMgc2hpZnRFbGVtZW50cyhzdGFydDogbnVtYmVyLCBjb3VudDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IGFyZ3VtZW50IG91dCBvZiByYW5nZScpO1xuICAgIH1cbiAgICBpZiAoc3RhcnQgKyBvZmZzZXQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzaGlmdCBlbGVtZW50cyBpbiBsaXN0IGJleW9uZCBpbmRleCAwJyk7XG4gICAgfVxuXG4gICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgIGZvciAobGV0IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMuc2V0KHN0YXJ0ICsgaSArIG9mZnNldCwgdGhpcy5nZXQoc3RhcnQgKyBpKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBleHBhbmRMaXN0QnkgPSAoc3RhcnQgKyBjb3VudCArIG9mZnNldCkgLSB0aGlzLl9sZW5ndGg7XG4gICAgICBpZiAoZXhwYW5kTGlzdEJ5ID4gMCkge1xuICAgICAgICB0aGlzLl9sZW5ndGggKz0gZXhwYW5kTGlzdEJ5O1xuICAgICAgICB3aGlsZSAodGhpcy5fbGVuZ3RoID4gdGhpcy5fbWF4TGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5fbGVuZ3RoLS07XG4gICAgICAgICAgdGhpcy5fc3RhcnRJbmRleCsrO1xuICAgICAgICAgIHRoaXMub25UcmltRW1pdHRlci5maXJlKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB0aGlzLnNldChzdGFydCArIGkgKyBvZmZzZXQsIHRoaXMuZ2V0KHN0YXJ0ICsgaSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjeWNsaWMgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgcmVndWxhciBpbmRleC4gVGhlIGN5Y2xpYyBpbmRleCBjYW4gdGhlbiBiZSB1c2VkIG9uIHRoZVxuICAgKiBiYWNraW5nIGFycmF5IHRvIGdldCB0aGUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ3VsYXIgaW5kZXguXG4gICAqIEBwYXJhbSBpbmRleCBUaGUgcmVndWxhciBpbmRleC5cbiAgICogQHJldHVybnMgVGhlIGN5Y2xpYyBpbmRleC5cbiAgICovXG4gIHByaXZhdGUgX2dldEN5Y2xpY0luZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5fc3RhcnRJbmRleCArIGluZGV4KSAlIHRoaXMuX21heExlbmd0aDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKlxuICogQSBzaW1wbGUgdXRpbGl0eSBmb3IgY2xvbmluZyB2YWx1ZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lPFQ+KHZhbDogVCwgZGVwdGg6IG51bWJlciA9IDUpOiBUIHtcbiAgaWYgKHR5cGVvZiB2YWwgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIC8vIElmIHdlJ3JlIGNsb25pbmcgYW4gYXJyYXksIHVzZSBhbiBhcnJheSBhcyB0aGUgYmFzZSwgb3RoZXJ3aXNlIHVzZSBhbiBvYmplY3RcbiAgY29uc3QgY2xvbmVkT2JqZWN0OiBhbnkgPSBBcnJheS5pc0FycmF5KHZhbCkgPyBbXSA6IHt9O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIHZhbCkge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNsb25lIGVhY2sgaXRlbSB1bmxlc3Mgd2UncmUgYXQgdGhlIG1heGltdW0gZGVwdGhcbiAgICBjbG9uZWRPYmplY3Rba2V5XSA9IGRlcHRoIDw9IDEgPyB2YWxba2V5XSA6ICh2YWxba2V5XSAmJiBjbG9uZSh2YWxba2V5XSwgZGVwdGggLSAxKSk7XG4gIH1cblxuICByZXR1cm4gY2xvbmVkT2JqZWN0IGFzIFQ7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb2xvciwgSUNvbG9yUkdCIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxubGV0ICRyID0gMDtcbmxldCAkZyA9IDA7XG5sZXQgJGIgPSAwO1xubGV0ICRhID0gMDtcblxuZXhwb3J0IGNvbnN0IE5VTExfQ09MT1I6IElDb2xvciA9IHtcbiAgY3NzOiAnIzAwMDAwMDAwJyxcbiAgcmdiYTogMFxufTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNoYW5uZWxzXCIgKGluZGl2aWR1YWwgY29sb3IgY2hhbm5lbHMgYXMgbnVtYmVycykuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgY2hhbm5lbHMge1xuICBleHBvcnQgZnVuY3Rpb24gdG9Dc3MocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlciwgYT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGAjJHt0b1BhZGRlZEhleChyKX0ke3RvUGFkZGVkSGV4KGcpfSR7dG9QYWRkZWRIZXgoYil9JHt0b1BhZGRlZEhleChhKX1gO1xuICAgIH1cbiAgICByZXR1cm4gYCMke3RvUGFkZGVkSGV4KHIpfSR7dG9QYWRkZWRIZXgoZyl9JHt0b1BhZGRlZEhleChiKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvUmdiYShyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIgPSAweEZGKTogbnVtYmVyIHtcbiAgICAvLyBOb3RlOiBUaGUgYWdncmVnYXRlZCBudW1iZXIgaXMgUkdCQTMyIChCRSksIHRodXMgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIEFCR1IzMlxuICAgIC8vIG9uIExFIHN5c3RlbXMsIGJlZm9yZSBpdCBjYW4gYmUgdXNlZCBmb3IgZGlyZWN0IDMyLWJpdCBidWZmZXIgd3JpdGVzLlxuICAgIC8vID4+PiAwIGZvcmNlcyBhbiB1bnNpZ25lZCBpbnRcbiAgICByZXR1cm4gKHIgPDwgMjQgfCBnIDw8IDE2IHwgYiA8PCA4IHwgYSkgPj4+IDA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhPzogbnVtYmVyKTogSUNvbG9yIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3NzOiBjaGFubmVscy50b0NzcyhyLCBnLCBiLCBhKSxcbiAgICAgIHJnYmE6IGNoYW5uZWxzLnRvUmdiYShyLCBnLCBiLCBhKVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBgSUNvbG9yYC5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBjb2xvciB7XG4gIGV4cG9ydCBmdW5jdGlvbiBibGVuZChiZzogSUNvbG9yLCBmZzogSUNvbG9yKTogSUNvbG9yIHtcbiAgICAkYSA9IChmZy5yZ2JhICYgMHhGRikgLyAyNTU7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjc3M6IGZnLmNzcyxcbiAgICAgICAgcmdiYTogZmcucmdiYVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmdSID0gKGZnLnJnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBmZ0cgPSAoZmcucmdiYSA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZy5yZ2JhID4+IDgpICYgMHhGRjtcbiAgICBjb25zdCBiZ1IgPSAoYmcucmdiYSA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGJnRyA9IChiZy5yZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnLnJnYmEgPj4gOCkgJiAweEZGO1xuICAgICRyID0gYmdSICsgTWF0aC5yb3VuZCgoZmdSIC0gYmdSKSAqICRhKTtcbiAgICAkZyA9IGJnRyArIE1hdGgucm91bmQoKGZnRyAtIGJnRykgKiAkYSk7XG4gICAgJGIgPSBiZ0IgKyBNYXRoLnJvdW5kKChmZ0IgLSBiZ0IpICogJGEpO1xuICAgIGNvbnN0IGNzcyA9IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpO1xuICAgIGNvbnN0IHJnYmEgPSBjaGFubmVscy50b1JnYmEoJHIsICRnLCAkYik7XG4gICAgcmV0dXJuIHsgY3NzLCByZ2JhIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaXNPcGFxdWUoY29sb3I6IElDb2xvcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY29sb3IucmdiYSAmIDB4RkYpID09PSAweEZGO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmc6IElDb2xvciwgZmc6IElDb2xvciwgcmF0aW86IG51bWJlcik6IElDb2xvciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmdiYS5lbnN1cmVDb250cmFzdFJhdGlvKGJnLnJnYmEsIGZnLnJnYmEsIHJhdGlvKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoXG4gICAgICAocmVzdWx0ID4+IDI0ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDE2ICYgMHhGRiksXG4gICAgICAocmVzdWx0ID4+IDggICYgMHhGRilcbiAgICApO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9wYXF1ZShjb2xvcjogSUNvbG9yKTogSUNvbG9yIHtcbiAgICBjb25zdCByZ2JhQ29sb3IgPSAoY29sb3IucmdiYSB8IDB4RkYpID4+PiAwO1xuICAgIFskciwgJGcsICRiXSA9IHJnYmEudG9DaGFubmVscyhyZ2JhQ29sb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBjc3M6IGNoYW5uZWxzLnRvQ3NzKCRyLCAkZywgJGIpLFxuICAgICAgcmdiYTogcmdiYUNvbG9yXG4gICAgfTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBvcGFjaXR5KGNvbG9yOiBJQ29sb3IsIG9wYWNpdHk6IG51bWJlcik6IElDb2xvciB7XG4gICAgJGEgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAweEZGKTtcbiAgICBbJHIsICRnLCAkYl0gPSByZ2JhLnRvQ2hhbm5lbHMoY29sb3IucmdiYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNzczogY2hhbm5lbHMudG9Dc3MoJHIsICRnLCAkYiwgJGEpLFxuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKVxuICAgIH07XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlPcGFjaXR5KGNvbG9yOiBJQ29sb3IsIGZhY3RvcjogbnVtYmVyKTogSUNvbG9yIHtcbiAgICAkYSA9IGNvbG9yLnJnYmEgJiAweEZGO1xuICAgIHJldHVybiBvcGFjaXR5KGNvbG9yLCAoJGEgKiBmYWN0b3IpIC8gMHhGRik7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvclJHQihjb2xvcjogSUNvbG9yKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gWyhjb2xvci5yZ2JhID4+IDI0KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDE2KSAmIDB4RkYsIChjb2xvci5yZ2JhID4+IDgpICYgMHhGRl07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcImNzc1wiIChzdHJpbmc6ICcjcmdiJywgJyNyZ2JhJywgJyNycmdnYmInLFxuICogJyNycmdnYmJhYScpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIGNzcyB7XG4gIC8vIEF0dGVtcHQgdG8gc2V0IGdldCB0aGUgc2hhcmVkIGNhbnZhcyBjb250ZXh0XG4gIGxldCAkY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCB1bmRlZmluZWQ7XG4gIGxldCAkbGl0bXVzQ29sb3I6IENhbnZhc0dyYWRpZW50IHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byBydW4gaW4gdGhlIGZpcnN0IHdpbmRvdywgc28gZG9jdW1lbnQgc2hvdWxkIGJlIGNvcnJlY3RcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSAxO1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcsIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseTogdHJ1ZVxuICAgIH0pO1xuICAgIGlmIChjdHgpIHtcbiAgICAgICRjdHggPSBjdHg7XG4gICAgICAkY3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdjb3B5JztcbiAgICAgICRsaXRtdXNDb2xvciA9ICRjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgMSwgMSk7XG4gICAgfVxuICB9XG4gIGNhdGNoIHtcbiAgICAvLyBub29wXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjc3Mgc3RyaW5nIHRvIGFuIElDb2xvciwgdGhpcyBzaG91bGQgaGFuZGxlIGFsbCB2YWxpZCBDU1MgY29sb3Igc3RyaW5ncyBhbmQgd2lsbFxuICAgKiB0aHJvdyBpZiBpdCdzIGludmFsaWQuIFRoZSBpZGVhbCBmb3JtYXQgdG8gdXNlIGlzIGAjcnJnZ2JiW2FhXWAgYXMgaXQncyB0aGUgZmFzdGVzdCB0byBwYXJzZS5cbiAgICpcbiAgICogT25seSBgI3JnYlthXWAsIGAjcnJnZ2JiW2FhXWAsIGByZ2IoKWAgYW5kIGByZ2JhKClgIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCB3aGVuIHJ1biBpbiBhIE5vZGVcbiAgICogZW52aXJvbm1lbnQuXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gdG9Db2xvcihjc3M6IHN0cmluZyk6IElDb2xvciB7XG4gICAgLy8gRm9ybWF0czogI3JnYlthXSBhbmQgI3JyZ2diYlthYV1cbiAgICBpZiAoY3NzLm1hdGNoKC8jW1xcZGEtZl17Myw4fS9pKSkge1xuICAgICAgc3dpdGNoIChjc3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgNDogeyAvLyAjcmdiXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSA1OiB7IC8vICNyZ2JhXG4gICAgICAgICAgJHIgPSBwYXJzZUludChjc3Muc2xpY2UoMSwgMikucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGcgPSBwYXJzZUludChjc3Muc2xpY2UoMiwgMykucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGIgPSBwYXJzZUludChjc3Muc2xpY2UoMywgNCkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgJGEgPSBwYXJzZUludChjc3Muc2xpY2UoNCwgNSkucmVwZWF0KDIpLCAxNik7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxzLnRvQ29sb3IoJHIsICRnLCAkYiwgJGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgNzogLy8gI3JyZ2diYlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjc3MsXG4gICAgICAgICAgICByZ2JhOiAocGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPDwgOCB8IDB4RkYpID4+PiAwXG4gICAgICAgICAgfTtcbiAgICAgICAgY2FzZSA5OiAvLyAjcnJnZ2JiYWFcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY3NzLFxuICAgICAgICAgICAgcmdiYTogcGFyc2VJbnQoY3NzLnNsaWNlKDEpLCAxNikgPj4+IDBcbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdHM6IHJnYigpIG9yIHJnYmEoKVxuICAgIGNvbnN0IHJnYmFNYXRjaCA9IGNzcy5tYXRjaCgvcmdiYT9cXChcXHMqKFxcZHsxLDN9KVxccyosXFxzKihcXGR7MSwzfSlcXHMqLFxccyooXFxkezEsM30pXFxzKigsXFxzKigwfDF8XFxkP1xcLihcXGQrKSlcXHMqKT9cXCkvKTtcbiAgICBpZiAocmdiYU1hdGNoKSB7XG4gICAgICAkciA9IHBhcnNlSW50KHJnYmFNYXRjaFsxXSk7XG4gICAgICAkZyA9IHBhcnNlSW50KHJnYmFNYXRjaFsyXSk7XG4gICAgICAkYiA9IHBhcnNlSW50KHJnYmFNYXRjaFszXSk7XG4gICAgICAkYSA9IE1hdGgucm91bmQoKHJnYmFNYXRjaFs1XSA9PT0gdW5kZWZpbmVkID8gMSA6IHBhcnNlRmxvYXQocmdiYU1hdGNoWzVdKSkgKiAweEZGKTtcbiAgICAgIHJldHVybiBjaGFubmVscy50b0NvbG9yKCRyLCAkZywgJGIsICRhKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29udGV4dCBpcyBhdmFpbGFibGUgZm9yIGNhbnZhcy1iYXNlZCBjb2xvciBwYXJzaW5nXG4gICAgaWYgKCEkY3R4IHx8ICEkbGl0bXVzQ29sb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgY29sb3IgdXNpbmcgY2FudmFzIGZpbGxTdHlsZVxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNmaWxsLWFuZC1zdHJva2Utc3R5bGVzXG4gICAgJGN0eC5maWxsU3R5bGUgPSAkbGl0bXVzQ29sb3I7XG4gICAgJGN0eC5maWxsU3R5bGUgPSBjc3M7XG4gICAgaWYgKHR5cGVvZiAkY3R4LmZpbGxTdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY3NzLnRvQ29sb3I6IFVuc3VwcG9ydGVkIGNzcyBmb3JtYXQnKTtcbiAgICB9XG5cbiAgICAkY3R4LmZpbGxSZWN0KDAsIDAsIDEsIDEpO1xuICAgIFskciwgJGcsICRiLCAkYV0gPSAkY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxLCAxKS5kYXRhO1xuXG4gICAgLy8gVmFsaWRhdGUgdGhlIGNvbG9yIGlzIG5vbi10cmFuc3BhcmVudCBhcyBjb2xvciBodWUgZ2V0cyBsb3N0IHdoZW4gZHJhd24gdG8gdGhlIGNhbnZhc1xuICAgIGlmICgkYSAhPT0gMHhGRikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjc3MudG9Db2xvcjogVW5zdXBwb3J0ZWQgY3NzIGZvcm1hdCcpO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhlIGNvbG9yIGZyb20gdGhlIGNhbnZhcycgZmlsbFN0eWxlIHByb3BlcnR5IHdoaWNoIGV4cG9zZXMgdGhlIGNvbG9yIHZhbHVlIGluIHJnYmEoKVxuICAgIC8vIGZvcm1hdFxuICAgIC8vIFNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9jYW52YXMuaHRtbCNzZXJpYWxpc2F0aW9uLW9mLWEtY29sb3JcbiAgICByZXR1cm4ge1xuICAgICAgcmdiYTogY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIsICRhKSxcbiAgICAgIGNzc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb25zIHdoZXJlIHRoZSBzb3VyY2UgdHlwZSBpcyBcInJnYlwiIChudW1iZXI6IDB4cnJnZ2JiKS5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSByZ2Ige1xuICAvKipcbiAgICogR2V0cyB0aGUgcmVsYXRpdmUgbHVtaW5hbmNlIG9mIGFuIFJHQiBjb2xvciwgdGhpcyBpcyB1c2VmdWwgaW4gZGV0ZXJtaW5pbmcgdGhlIGNvbnRyYXN0IHJhdGlvXG4gICAqIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAgICogQHBhcmFtIHJnYiBUaGUgY29sb3IgdG8gdXNlLlxuICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMdW1pbmFuY2UocmdiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiByZWxhdGl2ZUx1bWluYW5jZTIoXG4gICAgICAocmdiID4+IDE2KSAmIDB4RkYsXG4gICAgICAocmdiID4+IDggKSAmIDB4RkYsXG4gICAgICAocmdiICAgICAgKSAmIDB4RkYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlbGF0aXZlIGx1bWluYW5jZSBvZiBhbiBSR0IgY29sb3IsIHRoaXMgaXMgdXNlZnVsIGluIGRldGVybWluaW5nIHRoZSBjb250cmFzdCByYXRpb1xuICAgKiBiZXR3ZWVuIHR3byBjb2xvcnMuXG4gICAqIEBwYXJhbSByIFRoZSByZWQgY2hhbm5lbCAoMHgwMCB0byAweEZGKS5cbiAgICogQHBhcmFtIGcgVGhlIGdyZWVuIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBwYXJhbSBiIFRoZSBibHVlIGNoYW5uZWwgKDB4MDAgdG8gMHhGRikuXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jcmVsYXRpdmVsdW1pbmFuY2VkZWZcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZUx1bWluYW5jZTIocjogbnVtYmVyLCBnOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgcnMgPSByIC8gMjU1O1xuICAgIGNvbnN0IGdzID0gZyAvIDI1NTtcbiAgICBjb25zdCBicyA9IGIgLyAyNTU7XG4gICAgY29uc3QgcnIgPSBycyA8PSAwLjAzOTI4ID8gcnMgLyAxMi45MiA6IE1hdGgucG93KChycyArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgIGNvbnN0IHJnID0gZ3MgPD0gMC4wMzkyOCA/IGdzIC8gMTIuOTIgOiBNYXRoLnBvdygoZ3MgKyAwLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICBjb25zdCByYiA9IGJzIDw9IDAuMDM5MjggPyBicyAvIDEyLjkyIDogTWF0aC5wb3coKGJzICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgcmV0dXJuIHJyICogMC4yMTI2ICsgcmcgKiAwLjcxNTIgKyByYiAqIDAuMDcyMjtcbiAgfVxufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbnMgd2hlcmUgdGhlIHNvdXJjZSB0eXBlIGlzIFwicmdiYVwiIChudW1iZXI6IDB4cnJnZ2JiYWEpLlxuICovXG5leHBvcnQgbmFtZXNwYWNlIHJnYmEge1xuICBleHBvcnQgZnVuY3Rpb24gYmxlbmQoYmc6IG51bWJlciwgZmc6IG51bWJlcik6IG51bWJlciB7XG4gICAgJGEgPSAoZmcgJiAweEZGKSAvIDB4RkY7XG4gICAgaWYgKCRhID09PSAxKSB7XG4gICAgICByZXR1cm4gZmc7XG4gICAgfVxuICAgIGNvbnN0IGZnUiA9IChmZyA+PiAyNCkgJiAweEZGO1xuICAgIGNvbnN0IGZnRyA9IChmZyA+PiAxNikgJiAweEZGO1xuICAgIGNvbnN0IGZnQiA9IChmZyA+PiA4KSAmIDB4RkY7XG4gICAgY29uc3QgYmdSID0gKGJnID4+IDI0KSAmIDB4RkY7XG4gICAgY29uc3QgYmdHID0gKGJnID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnID4+IDgpICYgMHhGRjtcbiAgICAkciA9IGJnUiArIE1hdGgucm91bmQoKGZnUiAtIGJnUikgKiAkYSk7XG4gICAgJGcgPSBiZ0cgKyBNYXRoLnJvdW5kKChmZ0cgLSBiZ0cpICogJGEpO1xuICAgICRiID0gYmdCICsgTWF0aC5yb3VuZCgoZmdCIC0gYmdCKSAqICRhKTtcbiAgICByZXR1cm4gY2hhbm5lbHMudG9SZ2JhKCRyLCAkZywgJGIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgZm9yZWdyb3VuZCBjb2xvciBhbmQgYSBiYWNrZ3JvdW5kIGNvbG9yLCBlaXRoZXIgaW5jcmVhc2Ugb3IgcmVkdWNlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlXG4gICAqIGZvcmVncm91bmQgY29sb3IgdW50aWwgdGhlIHNwZWNpZmllZCBjb250cmFzdCByYXRpbyBpcyBtZXQuIElmIHB1cmUgd2hpdGUgb3IgYmxhY2sgaXMgaGl0XG4gICAqIHdpdGhvdXQgdGhlIGNvbnRyYXN0IHJhdGlvIGJlaW5nIG1ldCwgZ28gdGhlIG90aGVyIGRpcmVjdGlvbiB1c2luZyB0aGUgYmFja2dyb3VuZCBjb2xvciBhcyB0aGVcbiAgICogZm9yZWdyb3VuZCBjb2xvciBhbmQgdGFrZSBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCByZXN1bHQgZGVwZW5kaW5nIG9uIHdoaWNoIGhhcyB0aGUgaGlnaGVyXG4gICAqIGNvbnRyYXN0IHJhdGlvLlxuICAgKlxuICAgKiBgdW5kZWZpbmVkYCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBjb250cmFzdCByYXRpbyBpcyBhbHJlYWR5IG1ldC5cbiAgICpcbiAgICogQHBhcmFtIGJnUmdiYSBUaGUgYmFja2dyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIGZnUmdiYSBUaGUgZm9yZWdyb3VuZCBjb2xvciBpbiByZ2JhIGZvcm1hdC5cbiAgICogQHBhcmFtIHJhdGlvIFRoZSBjb250cmFzdCByYXRpbyB0byBhY2hpZXZlLlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUNvbnRyYXN0UmF0aW8oYmdSZ2JhOiBudW1iZXIsIGZnUmdiYTogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiZ0wgPSByZ2IucmVsYXRpdmVMdW1pbmFuY2UoYmdSZ2JhID4+IDgpO1xuICAgIGNvbnN0IGZnTCA9IHJnYi5yZWxhdGl2ZUx1bWluYW5jZShmZ1JnYmEgPj4gOCk7XG4gICAgY29uc3QgY3IgPSBjb250cmFzdFJhdGlvKGJnTCwgZmdMKTtcbiAgICBpZiAoY3IgPCByYXRpbykge1xuICAgICAgaWYgKGZnTCA8IGJnTCkge1xuICAgICAgICBjb25zdCByZXN1bHRBID0gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEFSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QSA+PiA4KSk7XG4gICAgICAgIGlmIChyZXN1bHRBUmF0aW8gPCByYXRpbykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEIgPSBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmEsIGZnUmdiYSwgcmF0aW8pO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdEJSYXRpbyA9IGNvbnRyYXN0UmF0aW8oYmdMLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UocmVzdWx0QiA+PiA4KSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRBO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0QSA9IGluY3JlYXNlTHVtaW5hbmNlKGJnUmdiYSwgZmdSZ2JhLCByYXRpbyk7XG4gICAgICBjb25zdCByZXN1bHRBUmF0aW8gPSBjb250cmFzdFJhdGlvKGJnTCwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlKHJlc3VsdEEgPj4gOCkpO1xuICAgICAgaWYgKHJlc3VsdEFSYXRpbyA8IHJhdGlvKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEIgPSByZWR1Y2VMdW1pbmFuY2UoYmdSZ2JhLCBmZ1JnYmEsIHJhdGlvKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QlJhdGlvID0gY29udHJhc3RSYXRpbyhiZ0wsIHJnYi5yZWxhdGl2ZUx1bWluYW5jZShyZXN1bHRCID4+IDgpKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdEFSYXRpbyA+IHJlc3VsdEJSYXRpbyA/IHJlc3VsdEEgOiByZXN1bHRCO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdEE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gcmVkdWNlTHVtaW5hbmNlKGJnUmdiYTogbnVtYmVyLCBmZ1JnYmE6IG51bWJlciwgcmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gVGhpcyBpcyBhIG5haXZlIGJ1dCBmYXN0IGFwcHJvYWNoIHRvIHJlZHVjaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA+IDAgfHwgZmdHID4gMCB8fCBmZ0IgPiAwKSkge1xuICAgICAgLy8gUmVkdWNlIGJ5IDEwJSB1bnRpbCB0aGUgcmF0aW8gaXMgaGl0XG4gICAgICBmZ1IgLT0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKGZnUiAqIDAuMSkpO1xuICAgICAgZmdHIC09IE1hdGgubWF4KDAsIE1hdGguY2VpbChmZ0cgKiAwLjEpKTtcbiAgICAgIGZnQiAtPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoZmdCICogMC4xKSk7XG4gICAgICBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgfVxuICAgIHJldHVybiAoZmdSIDw8IDI0IHwgZmdHIDw8IDE2IHwgZmdCIDw8IDggfCAweEZGKSA+Pj4gMDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNyZWFzZUx1bWluYW5jZShiZ1JnYmE6IG51bWJlciwgZmdSZ2JhOiBudW1iZXIsIHJhdGlvOiBudW1iZXIpOiBudW1iZXIge1xuICAgIC8vIFRoaXMgaXMgYSBuYWl2ZSBidXQgZmFzdCBhcHByb2FjaCB0byBpbmNyZWFzaW5nIGx1bWluYW5jZSBhcyBjb252ZXJ0aW5nIHRvXG4gICAgLy8gSFNMIGFuZCBiYWNrIGlzIGV4cGVuc2l2ZVxuICAgIGNvbnN0IGJnUiA9IChiZ1JnYmEgPj4gMjQpICYgMHhGRjtcbiAgICBjb25zdCBiZ0cgPSAoYmdSZ2JhID4+IDE2KSAmIDB4RkY7XG4gICAgY29uc3QgYmdCID0gKGJnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBmZ1IgPSAoZmdSZ2JhID4+IDI0KSAmIDB4RkY7XG4gICAgbGV0IGZnRyA9IChmZ1JnYmEgPj4gMTYpICYgMHhGRjtcbiAgICBsZXQgZmdCID0gKGZnUmdiYSA+PiAgOCkgJiAweEZGO1xuICAgIGxldCBjciA9IGNvbnRyYXN0UmF0aW8ocmdiLnJlbGF0aXZlTHVtaW5hbmNlMihmZ1IsIGZnRywgZmdCKSwgcmdiLnJlbGF0aXZlTHVtaW5hbmNlMihiZ1IsIGJnRywgYmdCKSk7XG4gICAgd2hpbGUgKGNyIDwgcmF0aW8gJiYgKGZnUiA8IDB4RkYgfHwgZmdHIDwgMHhGRiB8fCBmZ0IgPCAweEZGKSkge1xuICAgICAgLy8gSW5jcmVhc2UgYnkgMTAlIHVudGlsIHRoZSByYXRpbyBpcyBoaXRcbiAgICAgIGZnUiA9IE1hdGgubWluKDB4RkYsIGZnUiArIE1hdGguY2VpbCgoMjU1IC0gZmdSKSAqIDAuMSkpO1xuICAgICAgZmdHID0gTWF0aC5taW4oMHhGRiwgZmdHICsgTWF0aC5jZWlsKCgyNTUgLSBmZ0cpICogMC4xKSk7XG4gICAgICBmZ0IgPSBNYXRoLm1pbigweEZGLCBmZ0IgKyBNYXRoLmNlaWwoKDI1NSAtIGZnQikgKiAwLjEpKTtcbiAgICAgIGNyID0gY29udHJhc3RSYXRpbyhyZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGZnUiwgZmdHLCBmZ0IpLCByZ2IucmVsYXRpdmVMdW1pbmFuY2UyKGJnUiwgYmdHLCBiZ0IpKTtcbiAgICB9XG4gICAgcmV0dXJuIChmZ1IgPDwgMjQgfCBmZ0cgPDwgMTYgfCBmZ0IgPDwgOCB8IDB4RkYpID4+PiAwO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHRvQ2hhbm5lbHModmFsdWU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgICByZXR1cm4gWyh2YWx1ZSA+PiAyNCkgJiAweEZGLCAodmFsdWUgPj4gMTYpICYgMHhGRiwgKHZhbHVlID4+IDgpICYgMHhGRiwgdmFsdWUgJiAweEZGXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9QYWRkZWRIZXgoYzogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IGMudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gcy5sZW5ndGggPCAyID8gJzAnICsgcyA6IHM7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29udHJhc3QgcmF0aW8gYmV0d2VlbiB0d28gcmVsYXRpdmUgbHVtaW5hbmNlIHZhbHVlcy5cbiAqIEBwYXJhbSBsMSBUaGUgZmlyc3QgcmVsYXRpdmUgbHVtaW5hbmNlLlxuICogQHBhcmFtIGwyIFRoZSBmaXJzdCByZWxhdGl2ZSBsdW1pbmFuY2UuXG4gKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI2NvbnRyYXN0LXJhdGlvZGVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cmFzdFJhdGlvKGwxOiBudW1iZXIsIGwyOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobDEgPCBsMikge1xuICAgIHJldHVybiAobDIgKyAwLjA1KSAvIChsMSArIDAuMDUpO1xuICB9XG4gIHJldHVybiAobDEgKyAwLjA1KSAvIChsMiArIDAuMDUpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBDaHJpc3RvcGhlciBKZWZmcmV5IChNSVQgTGljZW5zZSlcbiAqIEBsaWNlbnNlIE1JVFxuICpcbiAqIE9yaWdpbmFsbHkgZm9ya2VkIGZyb20gKHdpdGggdGhlIGF1dGhvcidzIHBlcm1pc3Npb24pOlxuICogICBGYWJyaWNlIEJlbGxhcmQncyBqYXZhc2NyaXB0IHZ0MTAwIGZvciBqc2xpbnV4OlxuICogICBodHRwOi8vYmVsbGFyZC5vcmcvanNsaW51eC9cbiAqICAgQ29weXJpZ2h0IChjKSAyMDExIEZhYnJpY2UgQmVsbGFyZFxuICogICBUaGUgb3JpZ2luYWwgZGVzaWduIHJlbWFpbnMuIFRoZSB0ZXJtaW5hbCBpdHNlbGZcbiAqICAgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gaW5jbHVkZSB4dGVybSBDU0kgY29kZXMsIGFtb25nXG4gKiAgIG90aGVyIGZlYXR1cmVzLlxuICpcbiAqIFRlcm1pbmFsIEVtdWxhdGlvbiBSZWZlcmVuY2VzOlxuICogICBodHRwOi8vdnQxMDAubmV0L1xuICogICBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQveHRlcm0vY3Rsc2Vxcy9jdGxzZXFzLnR4dFxuICogICBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQveHRlcm0vY3Rsc2Vxcy9jdGxzZXFzLmh0bWxcbiAqICAgaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3Z0dGVzdC9cbiAqICAgaHR0cDovL3d3dy5pbndhcC5jb20vcGRwMTAvYW5zaWNvZGUudHh0XG4gKiAgIGh0dHA6Ly9saW51eC5kaWUubmV0L21hbi80L2NvbnNvbGVfY29kZXNcbiAqICAgaHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzcvdXJ4dnRcbiAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlLCBNdXRhYmxlRGlzcG9zYWJsZSwgdG9EaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL0xpZmVjeWNsZSc7XG5pbXBvcnQgeyBJSW5zdGFudGlhdGlvblNlcnZpY2UsIElPcHRpb25zU2VydmljZSwgSUJ1ZmZlclNlcnZpY2UsIElMb2dTZXJ2aWNlLCBJQ2hhcnNldFNlcnZpY2UsIElDb3JlU2VydmljZSwgSUNvcmVNb3VzZVNlcnZpY2UsIElVbmljb2RlU2VydmljZSwgTG9nTGV2ZWxFbnVtLCBJVGVybWluYWxPcHRpb25zLCBJT3NjTGlua1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgSW5zdGFudGlhdGlvblNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvSW5zdGFudGlhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgTG9nU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Mb2dTZXJ2aWNlJztcbmltcG9ydCB7IEJ1ZmZlclNlcnZpY2UsIE1JTklNVU1fQ09MUywgTUlOSU1VTV9ST1dTIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0J1ZmZlclNlcnZpY2UnO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvT3B0aW9uc1NlcnZpY2UnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUsIElBdHRyaWJ1dGVEYXRhLCBJQ29yZVRlcm1pbmFsLCBJU2Nyb2xsRXZlbnQsIFNjcm9sbFNvdXJjZSB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBDb3JlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Db3JlU2VydmljZSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIElFdmVudCwgZm9yd2FyZEV2ZW50IH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBDb3JlTW91c2VTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL0NvcmVNb3VzZVNlcnZpY2UnO1xuaW1wb3J0IHsgVW5pY29kZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvVW5pY29kZVNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhcnNldFNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvQ2hhcnNldFNlcnZpY2UnO1xuaW1wb3J0IHsgdXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUgfSBmcm9tICdjb21tb24vV2luZG93c01vZGUnO1xuaW1wb3J0IHsgSUZ1bmN0aW9uSWRlbnRpZmllciwgSVBhcmFtcyB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvVHlwZXMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNldCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRIYW5kbGVyIH0gZnJvbSAnY29tbW9uL0lucHV0SGFuZGxlcic7XG5pbXBvcnQgeyBXcml0ZUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9pbnB1dC9Xcml0ZUJ1ZmZlcic7XG5pbXBvcnQgeyBPc2NMaW5rU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Pc2NMaW5rU2VydmljZSc7XG5cbi8vIE9ubHkgdHJpZ2dlciB0aGlzIHdhcm5pbmcgYSBzaW5nbGUgdGltZSBwZXIgc2Vzc2lvblxubGV0IGhhc1dyaXRlU3luY1dhcm5IYXBwZW5lZCA9IGZhbHNlO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29yZVRlcm1pbmFsIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElDb3JlVGVybWluYWwge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2luc3RhbnRpYXRpb25TZXJ2aWNlOiBJSW5zdGFudGlhdGlvblNlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBfbG9nU2VydmljZTogSUxvZ1NlcnZpY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBfY2hhcnNldFNlcnZpY2U6IElDaGFyc2V0U2VydmljZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vc2NMaW5rU2VydmljZTogSU9zY0xpbmtTZXJ2aWNlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb3JlTW91c2VTZXJ2aWNlOiBJQ29yZU1vdXNlU2VydmljZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2U7XG4gIHB1YmxpYyByZWFkb25seSB1bmljb2RlU2VydmljZTogSVVuaWNvZGVTZXJ2aWNlO1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZTtcblxuICBwcm90ZWN0ZWQgX2lucHV0SGFuZGxlcjogSW5wdXRIYW5kbGVyO1xuICBwcml2YXRlIF93cml0ZUJ1ZmZlcjogV3JpdGVCdWZmZXI7XG4gIHByaXZhdGUgX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MgPSB0aGlzLnJlZ2lzdGVyKG5ldyBNdXRhYmxlRGlzcG9zYWJsZSgpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJpbmFyeSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25CaW5hcnkgPSB0aGlzLl9vbkJpbmFyeS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25EYXRhID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRhdGEgPSB0aGlzLl9vbkRhdGEuZXZlbnQ7XG4gIHByb3RlY3RlZCBfb25MaW5lRmVlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uTGluZUZlZWQgPSB0aGlzLl9vbkxpbmVGZWVkLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlc2l6ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXNpemUgPSB0aGlzLl9vblJlc2l6ZS5ldmVudDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vbldyaXRlUGFyc2VkID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Xcml0ZVBhcnNlZCA9IHRoaXMuX29uV3JpdGVQYXJzZWQuZXZlbnQ7XG5cbiAgLyoqXG4gICAqIEludGVybmFsbHkgd2UgdHJhY2sgdGhlIHNvdXJjZSBvZiB0aGUgc2Nyb2xsIGJ1dCB0aGlzIGlzIG1lYW5pbmdsZXNzIG91dHNpZGUgdGhlIGxpYnJhcnkgc29cbiAgICogaXQncyBmaWx0ZXJlZCBvdXQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX29uU2Nyb2xsQXBpPzogRXZlbnRFbWl0dGVyPG51bWJlciwgdm9pZD47XG4gIHByb3RlY3RlZCBfb25TY3JvbGwgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SVNjcm9sbEV2ZW50LCB2b2lkPigpKTtcbiAgcHVibGljIGdldCBvblNjcm9sbCgpOiBJRXZlbnQ8bnVtYmVyLCB2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9vblNjcm9sbEFwaSkge1xuICAgICAgdGhpcy5fb25TY3JvbGxBcGkgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyLCB2b2lkPigpKTtcbiAgICAgIHRoaXMuX29uU2Nyb2xsLmV2ZW50KGV2ID0+IHtcbiAgICAgICAgdGhpcy5fb25TY3JvbGxBcGk/LmZpcmUoZXYucG9zaXRpb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vblNjcm9sbEFwaS5ldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29scygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzOyB9XG4gIHB1YmxpYyBnZXQgcm93cygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzOyB9XG4gIHB1YmxpYyBnZXQgYnVmZmVycygpOiBJQnVmZmVyU2V0IHsgcmV0dXJuIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyczsgfVxuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz4geyByZXR1cm4gdGhpcy5vcHRpb25zU2VydmljZS5vcHRpb25zOyB9XG4gIHB1YmxpYyBzZXQgb3B0aW9ucyhvcHRpb25zOiBJVGVybWluYWxPcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zU2VydmljZS5vcHRpb25zW2tleV0gPSBvcHRpb25zW2tleV07XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogUGFydGlhbDxJVGVybWluYWxPcHRpb25zPlxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gU2V0dXAgYW5kIGluaXRpYWxpemUgc2VydmljZXNcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZSA9IG5ldyBJbnN0YW50aWF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMub3B0aW9uc1NlcnZpY2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBPcHRpb25zU2VydmljZShvcHRpb25zKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJT3B0aW9uc1NlcnZpY2UsIHRoaXMub3B0aW9uc1NlcnZpY2UpO1xuICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UgPSB0aGlzLnJlZ2lzdGVyKHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKEJ1ZmZlclNlcnZpY2UpKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElCdWZmZXJTZXJ2aWNlLCB0aGlzLl9idWZmZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9sb2dTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShMb2dTZXJ2aWNlKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJTG9nU2VydmljZSwgdGhpcy5fbG9nU2VydmljZSk7XG4gICAgdGhpcy5jb3JlU2VydmljZSA9IHRoaXMucmVnaXN0ZXIodGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoQ29yZVNlcnZpY2UpKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElDb3JlU2VydmljZSwgdGhpcy5jb3JlU2VydmljZSk7XG4gICAgdGhpcy5jb3JlTW91c2VTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShDb3JlTW91c2VTZXJ2aWNlKSk7XG4gICAgdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2Uuc2V0U2VydmljZShJQ29yZU1vdXNlU2VydmljZSwgdGhpcy5jb3JlTW91c2VTZXJ2aWNlKTtcbiAgICB0aGlzLnVuaWNvZGVTZXJ2aWNlID0gdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5jcmVhdGVJbnN0YW5jZShVbmljb2RlU2VydmljZSkpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSVVuaWNvZGVTZXJ2aWNlLCB0aGlzLnVuaWNvZGVTZXJ2aWNlKTtcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZSA9IHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLmNyZWF0ZUluc3RhbmNlKENoYXJzZXRTZXJ2aWNlKTtcbiAgICB0aGlzLl9pbnN0YW50aWF0aW9uU2VydmljZS5zZXRTZXJ2aWNlKElDaGFyc2V0U2VydmljZSwgdGhpcy5fY2hhcnNldFNlcnZpY2UpO1xuICAgIHRoaXMuX29zY0xpbmtTZXJ2aWNlID0gdGhpcy5faW5zdGFudGlhdGlvblNlcnZpY2UuY3JlYXRlSW5zdGFuY2UoT3NjTGlua1NlcnZpY2UpO1xuICAgIHRoaXMuX2luc3RhbnRpYXRpb25TZXJ2aWNlLnNldFNlcnZpY2UoSU9zY0xpbmtTZXJ2aWNlLCB0aGlzLl9vc2NMaW5rU2VydmljZSk7XG5cblxuICAgIC8vIFJlZ2lzdGVyIGlucHV0IGhhbmRsZXIgYW5kIGhhbmRsZS9mb3J3YXJkIGV2ZW50c1xuICAgIHRoaXMuX2lucHV0SGFuZGxlciA9IHRoaXMucmVnaXN0ZXIobmV3IElucHV0SGFuZGxlcih0aGlzLl9idWZmZXJTZXJ2aWNlLCB0aGlzLl9jaGFyc2V0U2VydmljZSwgdGhpcy5jb3JlU2VydmljZSwgdGhpcy5fbG9nU2VydmljZSwgdGhpcy5vcHRpb25zU2VydmljZSwgdGhpcy5fb3NjTGlua1NlcnZpY2UsIHRoaXMuY29yZU1vdXNlU2VydmljZSwgdGhpcy51bmljb2RlU2VydmljZSkpO1xuICAgIHRoaXMucmVnaXN0ZXIoZm9yd2FyZEV2ZW50KHRoaXMuX2lucHV0SGFuZGxlci5vbkxpbmVGZWVkLCB0aGlzLl9vbkxpbmVGZWVkKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9pbnB1dEhhbmRsZXIpO1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzXG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5fYnVmZmVyU2VydmljZS5vblJlc2l6ZSwgdGhpcy5fb25SZXNpemUpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLmNvcmVTZXJ2aWNlLm9uRGF0YSwgdGhpcy5fb25EYXRhKSk7XG4gICAgdGhpcy5yZWdpc3Rlcihmb3J3YXJkRXZlbnQodGhpcy5jb3JlU2VydmljZS5vbkJpbmFyeSwgdGhpcy5fb25CaW5hcnkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuY29yZVNlcnZpY2Uub25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20oKCkgPT4gdGhpcy5zY3JvbGxUb0JvdHRvbSgpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLmNvcmVTZXJ2aWNlLm9uVXNlcklucHV0KCgpID0+ICB0aGlzLl93cml0ZUJ1ZmZlci5oYW5kbGVVc2VySW5wdXQoKSkpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5vcHRpb25zU2VydmljZS5vbk11bHRpcGxlT3B0aW9uQ2hhbmdlKFsnd2luZG93c01vZGUnLCAnd2luZG93c1B0eSddLCAoKSA9PiB0aGlzLl9oYW5kbGVXaW5kb3dzUHR5T3B0aW9uQ2hhbmdlKCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2J1ZmZlclNlcnZpY2Uub25TY3JvbGwoZXZlbnQgPT4ge1xuICAgICAgdGhpcy5fb25TY3JvbGwuZmlyZSh7IHBvc2l0aW9uOiB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCwgc291cmNlOiBTY3JvbGxTb3VyY2UuVEVSTUlOQUwgfSk7XG4gICAgICB0aGlzLl9pbnB1dEhhbmRsZXIubWFya1JhbmdlRGlydHkodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRoaXMuX2lucHV0SGFuZGxlci5vblNjcm9sbChldmVudCA9PiB7XG4gICAgICB0aGlzLl9vblNjcm9sbC5maXJlKHsgcG9zaXRpb246IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwLCBzb3VyY2U6IFNjcm9sbFNvdXJjZS5URVJNSU5BTCB9KTtcbiAgICAgIHRoaXMuX2lucHV0SGFuZGxlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgfSkpO1xuXG4gICAgLy8gU2V0dXAgV3JpdGVCdWZmZXJcbiAgICB0aGlzLl93cml0ZUJ1ZmZlciA9IHRoaXMucmVnaXN0ZXIobmV3IFdyaXRlQnVmZmVyKChkYXRhLCBwcm9taXNlUmVzdWx0KSA9PiB0aGlzLl9pbnB1dEhhbmRsZXIucGFyc2UoZGF0YSwgcHJvbWlzZVJlc3VsdCkpKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGZvcndhcmRFdmVudCh0aGlzLl93cml0ZUJ1ZmZlci5vbldyaXRlUGFyc2VkLCB0aGlzLl9vbldyaXRlUGFyc2VkKSk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGUoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fd3JpdGVCdWZmZXIud3JpdGUoZGF0YSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGRhdGEgdG8gdGVybWluYWwgc3luY2hvbm91c2x5LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1bnJlbGlhYmxlIHdpdGggYXN5bmMgcGFyc2VyIGhhbmRsZXJzLCB0aHVzIHNob3VsZCBub3RcbiAgICogYmUgdXNlZCBhbnltb3JlLiBJZiB5b3UgbmVlZCBibG9ja2luZyBzZW1hbnRpY3Mgb24gZGF0YSBpbnB1dCBjb25zaWRlclxuICAgKiBgd3JpdGVgIHdpdGggYSBjYWxsYmFjayBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVbnJlbGlhYmxlLCB3aWxsIGJlIHJlbW92ZWQgc29vbi5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVN5bmMoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgbWF4U3Vic2VxdWVudENhbGxzPzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ1NlcnZpY2UubG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLldBUk4gJiYgIWhhc1dyaXRlU3luY1dhcm5IYXBwZW5lZCkge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS53YXJuKCd3cml0ZVN5bmMgaXMgdW5yZWxpYWJsZSBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uJyk7XG4gICAgICBoYXNXcml0ZVN5bmNXYXJuSGFwcGVuZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLl93cml0ZUJ1ZmZlci53cml0ZVN5bmMoZGF0YSwgbWF4U3Vic2VxdWVudENhbGxzKTtcbiAgfVxuXG4gIHB1YmxpYyBpbnB1dChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICB0aGlzLmNvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoZGF0YSwgd2FzVXNlcklucHV0KTtcbiAgfVxuXG4gIHB1YmxpYyByZXNpemUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB4ID0gTWF0aC5tYXgoeCwgTUlOSU1VTV9DT0xTKTtcbiAgICB5ID0gTWF0aC5tYXgoeSwgTUlOSU1VTV9ST1dTKTtcblxuICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UucmVzaXplKHgsIHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbCB0aGUgdGVybWluYWwgZG93biAxIHJvdywgY3JlYXRpbmcgYSBibGFuayBsaW5lLlxuICAgKiBAcGFyYW0gZXJhc2VBdHRyIFRoZSBhdHRyaWJ1dGUgZGF0YSB0byB1c2UgdGhlIGZvciBibGFuayBsaW5lLlxuICAgKiBAcGFyYW0gaXNXcmFwcGVkIFdoZXRoZXIgdGhlIG5ldyBsaW5lIGlzIHdyYXBwZWQgZnJvbSB0aGUgcHJldmlvdXMgbGluZS5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGwoZXJhc2VBdHRyOiBJQXR0cmlidXRlRGF0YSwgaXNXcmFwcGVkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLl9idWZmZXJTZXJ2aWNlLnNjcm9sbChlcmFzZUF0dHIsIGlzV3JhcHBlZCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xsIHRoZSBkaXNwbGF5IG9mIHRoZSB0ZXJtaW5hbFxuICAgKiBAcGFyYW0gZGlzcCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRvIHNjcm9sbCBkb3duIChuZWdhdGl2ZSBzY3JvbGwgdXApLlxuICAgKiBAcGFyYW0gc3VwcHJlc3NTY3JvbGxFdmVudCBEb24ndCBlbWl0IHRoZSBzY3JvbGwgZXZlbnQgYXMgc2Nyb2xsTGluZXMuIFRoaXMgaXMgdXNlZCB0byBhdm9pZFxuICAgKiB1bndhbnRlZCBldmVudHMgYmVpbmcgaGFuZGxlZCBieSB0aGUgdmlld3BvcnQgd2hlbiB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBmcm9tIHRoZSB2aWV3cG9ydFxuICAgKiBvcmlnaW5hbGx5LlxuICAgKiBAcGFyYW0gc291cmNlIFdoaWNoIGNvbXBvbmVudCB0aGUgZXZlbnQgY2FtZSBmcm9tLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudD86IGJvb2xlYW4sIHNvdXJjZT86IFNjcm9sbFNvdXJjZSk6IHZvaWQge1xuICAgIHRoaXMuX2J1ZmZlclNlcnZpY2Uuc2Nyb2xsTGluZXMoZGlzcCwgc3VwcHJlc3NTY3JvbGxFdmVudCwgc291cmNlKTtcbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxQYWdlcyhwYWdlQ291bnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsTGluZXMocGFnZUNvdW50ICogKHRoaXMucm93cyAtIDEpKTtcbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxUb1RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbExpbmVzKC10aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCk7XG4gIH1cblxuICBwdWJsaWMgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxMaW5lcyh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwKTtcbiAgfVxuXG4gIHB1YmxpYyBzY3JvbGxUb0xpbmUobGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc2Nyb2xsQW1vdW50ID0gbGluZSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwO1xuICAgIGlmIChzY3JvbGxBbW91bnQgIT09IDApIHtcbiAgICAgIHRoaXMuc2Nyb2xsTGluZXMoc2Nyb2xsQW1vdW50KTtcbiAgICB9XG4gIH1cblxuICAvKiogQWRkIGhhbmRsZXIgZm9yIEVTQyBlc2NhcGUgc2VxdWVuY2UuIFNlZSB4dGVybS5kLnRzIGZvciBkZXRhaWxzLiAqL1xuICBwdWJsaWMgcmVnaXN0ZXJFc2NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0SGFuZGxlci5yZWdpc3RlckVzY0hhbmRsZXIoaWQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBBZGQgaGFuZGxlciBmb3IgRENTIGVzY2FwZSBzZXF1ZW5jZS4gU2VlIHh0ZXJtLmQudHMgZm9yIGRldGFpbHMuICovXG4gIHB1YmxpYyByZWdpc3RlckRjc0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nLCBwYXJhbTogSVBhcmFtcykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0SGFuZGxlci5yZWdpc3RlckRjc0hhbmRsZXIoaWQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKiBBZGQgaGFuZGxlciBmb3IgQ1NJIGVzY2FwZSBzZXF1ZW5jZS4gU2VlIHh0ZXJtLmQudHMgZm9yIGRldGFpbHMuICovXG4gIHB1YmxpYyByZWdpc3RlckNzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAocGFyYW1zOiBJUGFyYW1zKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXRIYW5kbGVyLnJlZ2lzdGVyQ3NpSGFuZGxlcihpZCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqIEFkZCBoYW5kbGVyIGZvciBPU0MgZXNjYXBlIHNlcXVlbmNlLiBTZWUgeHRlcm0uZC50cyBmb3IgZGV0YWlscy4gKi9cbiAgcHVibGljIHJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudDogbnVtYmVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2lucHV0SGFuZGxlci5yZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc2V0dXAoKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlV2luZG93c1B0eU9wdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2lucHV0SGFuZGxlci5yZXNldCgpO1xuICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuY29yZVNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLmNvcmVNb3VzZVNlcnZpY2UucmVzZXQoKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfaGFuZGxlV2luZG93c1B0eU9wdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICBsZXQgdmFsdWUgPSBmYWxzZTtcbiAgICBjb25zdCB3aW5kb3dzUHR5ID0gdGhpcy5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NQdHk7XG4gICAgaWYgKHdpbmRvd3NQdHkgJiYgd2luZG93c1B0eS5idWlsZE51bWJlciAhPT0gdW5kZWZpbmVkICYmIHdpbmRvd3NQdHkuYnVpbGROdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSAhISh3aW5kb3dzUHR5LmJhY2tlbmQgPT09ICdjb25wdHknICYmIHdpbmRvd3NQdHkuYnVpbGROdW1iZXIgPCAyMTM3Nik7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c01vZGUpIHtcbiAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9lbmFibGVXaW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgX2VuYWJsZVdpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl93aW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzLnZhbHVlKSB7XG4gICAgICBjb25zdCBkaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuICAgICAgZGlzcG9zYWJsZXMucHVzaCh0aGlzLm9uTGluZUZlZWQodXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUuYmluZChudWxsLCB0aGlzLl9idWZmZXJTZXJ2aWNlKSkpO1xuICAgICAgZGlzcG9zYWJsZXMucHVzaCh0aGlzLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnSCcgfSwgKCkgPT4ge1xuICAgICAgICB1cGRhdGVXaW5kb3dzTW9kZVdyYXBwZWRTdGF0ZSh0aGlzLl9idWZmZXJTZXJ2aWNlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSkpO1xuICAgICAgdGhpcy5fd2luZG93c1dyYXBwaW5nSGV1cmlzdGljcy52YWx1ZSA9IHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBkaXNwb3NhYmxlcykge1xuICAgICAgICAgIGQuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5pbnRlcmZhY2UgSUxpc3RlbmVyPFQsIFUgPSB2b2lkPiB7XG4gIChhcmcxOiBULCBhcmcyOiBVKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXZlbnQ8VCwgVSA9IHZvaWQ+IHtcbiAgKGxpc3RlbmVyOiAoYXJnMTogVCwgYXJnMjogVSkgPT4gYW55KTogSURpc3Bvc2FibGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50RW1pdHRlcjxULCBVID0gdm9pZD4ge1xuICBldmVudDogSUV2ZW50PFQsIFU+O1xuICBmaXJlKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8VCwgVSA9IHZvaWQ+IGltcGxlbWVudHMgSUV2ZW50RW1pdHRlcjxULCBVPiB7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogSUxpc3RlbmVyPFQsIFU+W10gPSBbXTtcbiAgcHJpdmF0ZSBfZXZlbnQ/OiBJRXZlbnQ8VCwgVT47XG4gIHByaXZhdGUgX2Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGdldCBldmVudCgpOiBJRXZlbnQ8VCwgVT4ge1xuICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyOiAoYXJnMTogVCwgYXJnMjogVSkgPT4gYW55KSA9PiB7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZSA9IHtcbiAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBmaXJlKGFyZzE6IFQsIGFyZzI6IFUpOiB2b2lkIHtcbiAgICBjb25zdCBxdWV1ZTogSUxpc3RlbmVyPFQsIFU+W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgcXVldWUucHVzaCh0aGlzLl9saXN0ZW5lcnNbaV0pO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBxdWV1ZVtpXS5jYWxsKHVuZGVmaW5lZCwgYXJnMSwgYXJnMik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhckxpc3RlbmVycygpO1xuICAgIHRoaXMuX2Rpc3Bvc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckxpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmRFdmVudDxUPihmcm9tOiBJRXZlbnQ8VD4sIHRvOiBJRXZlbnRFbWl0dGVyPFQ+KTogSURpc3Bvc2FibGUge1xuICByZXR1cm4gZnJvbShlID0+IHRvLmZpcmUoZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuQW5kU3Vic2NyaWJlPFQ+KGV2ZW50OiBJRXZlbnQ8VD4sIGhhbmRsZXI6IChlOiBUIHwgdW5kZWZpbmVkKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XG4gIGhhbmRsZXIodW5kZWZpbmVkKTtcbiAgcmV0dXJuIGV2ZW50KGUgPT4gaGFuZGxlcihlKSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzLCBDaHJpc3RvcGhlciBKZWZmcmV5IChNSVQgTGljZW5zZSlcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElJbnB1dEhhbmRsZXIsIElBdHRyaWJ1dGVEYXRhLCBJRGlzcG9zYWJsZSwgSVdpbmRvd09wdGlvbnMsIElDb2xvckV2ZW50LCBJUGFyc2VTdGFjaywgQ29sb3JJbmRleCwgQ29sb3JSZXF1ZXN0VHlwZSwgU3BlY2lhbENvbG9ySW5kZXggfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQzAsIEMxIH0gZnJvbSAnY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzJztcbmltcG9ydCB7IENIQVJTRVRTLCBERUZBVUxUX0NIQVJTRVQgfSBmcm9tICdjb21tb24vZGF0YS9DaGFyc2V0cyc7XG5pbXBvcnQgeyBFc2NhcGVTZXF1ZW5jZVBhcnNlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvRXNjYXBlU2VxdWVuY2VQYXJzZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgU3RyaW5nVG9VdGYzMiwgc3RyaW5nRnJvbUNvZGVQb2ludCwgVXRmOFRvVXRmMzIgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgQnVmZmVyTGluZSwgREVGQVVMVF9BVFRSX0RBVEEgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlckxpbmUnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJUGFyc2luZ1N0YXRlLCBJRXNjYXBlU2VxdWVuY2VQYXJzZXIsIElQYXJhbXMsIElGdW5jdGlvbklkZW50aWZpZXIgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IE5VTExfQ0VMTF9DT0RFLCBOVUxMX0NFTExfV0lEVEgsIEF0dHJpYnV0ZXMsIEZnRmxhZ3MsIEJnRmxhZ3MsIENvbnRlbnQsIFVuZGVybGluZVN0eWxlIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgSUNvcmVTZXJ2aWNlLCBJQnVmZmVyU2VydmljZSwgSU9wdGlvbnNTZXJ2aWNlLCBJTG9nU2VydmljZSwgSUNvcmVNb3VzZVNlcnZpY2UsIElDaGFyc2V0U2VydmljZSwgSVVuaWNvZGVTZXJ2aWNlLCBMb2dMZXZlbEVudW0sIElPc2NMaW5rU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBVbmljb2RlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZSc7XG5pbXBvcnQgeyBPc2NIYW5kbGVyIH0gZnJvbSAnY29tbW9uL3BhcnNlci9Pc2NQYXJzZXInO1xuaW1wb3J0IHsgRGNzSGFuZGxlciB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvRGNzUGFyc2VyJztcbmltcG9ydCB7IElCdWZmZXIgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IHBhcnNlQ29sb3IgfSBmcm9tICdjb21tb24vaW5wdXQvWFBhcnNlQ29sb3InO1xuXG4vKipcbiAqIE1hcCBjb2xsZWN0IHRvIGdsZXZlbC4gVXNlZCBpbiBgc2VsZWN0Q2hhcnNldGAuXG4gKi9cbmNvbnN0IEdMRVZFTDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHsgJygnOiAwLCAnKSc6IDEsICcqJzogMiwgJysnOiAzLCAnLSc6IDEsICcuJzogMiB9O1xuXG4vKipcbiAqIFZUIGNvbW1hbmRzIGRvbmUgYnkgdGhlIHBhcnNlciAtIEZJWE1FOiBtb3ZlIHRoaXMgdG8gdGhlIHBhcnNlcj9cbiAqL1xuLy8gQHZ0OiAjWSAgIEVTQyAgIENTSSAgIFwiQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyXCIgICBcIkVTQyBbXCIgICBcIlN0YXJ0IG9mIGEgQ1NJIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgRVNDICAgT1NDICAgXCJPcGVyYXRpbmcgU3lzdGVtIENvbW1hbmRcIiAgICAgIFwiRVNDIF1cIiAgIFwiU3RhcnQgb2YgYW4gT1NDIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgRVNDICAgRENTICAgXCJEZXZpY2UgQ29udHJvbCBTdHJpbmdcIiAgICAgICAgIFwiRVNDIFBcIiAgIFwiU3RhcnQgb2YgYSBEQ1Mgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBFU0MgICBTVCAgICBcIlN0cmluZyBUZXJtaW5hdG9yXCIgICAgICAgICAgICAgXCJFU0MgXFxcIiAgIFwiVGVybWluYXRvciB1c2VkIGZvciBzdHJpbmcgdHlwZSBzZXF1ZW5jZXMuXCJcbi8vIEB2dDogI1kgICBFU0MgICBQTSAgICBcIlByaXZhY3kgTWVzc2FnZVwiICAgICAgICAgICAgICAgXCJFU0MgXlwiICAgXCJTdGFydCBvZiBhIHByaXZhY3kgbWVzc2FnZS5cIlxuLy8gQHZ0OiAjWSAgIEVTQyAgIEFQQyAgIFwiQXBwbGljYXRpb24gUHJvZ3JhbSBDb21tYW5kXCIgICBcIkVTQyBfXCIgICBcIlN0YXJ0IG9mIGFuIEFQQyBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEMxICAgIENTSSAgIFwiQ29udHJvbCBTZXF1ZW5jZSBJbnRyb2R1Y2VyXCIgICBcIlxceDlCXCIgICAgXCJTdGFydCBvZiBhIENTSSBzZXF1ZW5jZS5cIlxuLy8gQHZ0OiAjWSAgIEMxICAgIE9TQyAgIFwiT3BlcmF0aW5nIFN5c3RlbSBDb21tYW5kXCIgICAgICBcIlxceDlEXCIgICAgXCJTdGFydCBvZiBhbiBPU0Mgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBEQ1MgICBcIkRldmljZSBDb250cm9sIFN0cmluZ1wiICAgICAgICAgXCJcXHg5MFwiICAgIFwiU3RhcnQgb2YgYSBEQ1Mgc2VxdWVuY2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBTVCAgICBcIlN0cmluZyBUZXJtaW5hdG9yXCIgICAgICAgICAgICAgXCJcXHg5Q1wiICAgIFwiVGVybWluYXRvciB1c2VkIGZvciBzdHJpbmcgdHlwZSBzZXF1ZW5jZXMuXCJcbi8vIEB2dDogI1kgICBDMSAgICBQTSAgICBcIlByaXZhY3kgTWVzc2FnZVwiICAgICAgICAgICAgICAgXCJcXHg5RVwiICAgIFwiU3RhcnQgb2YgYSBwcml2YWN5IG1lc3NhZ2UuXCJcbi8vIEB2dDogI1kgICBDMSAgICBBUEMgICBcIkFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZFwiICAgXCJcXHg5RlwiICAgIFwiU3RhcnQgb2YgYW4gQVBDIHNlcXVlbmNlLlwiXG4vLyBAdnQ6ICNZICAgQzAgICAgTlVMICAgXCJOdWxsXCIgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXFwwLCBcXHgwMFwiICBcIk5VTCBpcyBpZ25vcmVkLlwiXG4vLyBAdnQ6ICNZICAgQzAgICAgRVNDICAgXCJFc2NhcGVcIiAgICAgICAgICAgICAgICAgICAgICAgIFwiXFxlLCBcXHgxQlwiICBcIlN0YXJ0IG9mIGEgc2VxdWVuY2UuIENhbmNlbHMgYW55IG90aGVyIHNlcXVlbmNlLlwiXG5cbi8qKlxuICogRG9jdW1lbnQgeHRlcm0gVlQgZmVhdHVyZXMgaGVyZSB0aGF0IGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWRcbiAqL1xuLy8gQHZ0OiAjRVtTdXBwb3J0ZWQgdmlhIEB4dGVybS9hZGRvbi1pbWFnZS5dICBEQ1MgICBTSVhFTCAgICAgICBcIlNJWEVMIEdyYXBoaWNzXCIgICAgICAgICAgXCJEQ1MgUHMgOyBQcyA7IFBzIDsgcSBcdFB0IFNUXCIgIFwiRHJhdyBTSVhFTCBpbWFnZS5cIlxuLy8gQHZ0OiAjTiAgRENTICAgREVDVURLICAgICAgXCJVc2VyIERlZmluZWQgS2V5c1wiICAgICAgIFwiRENTIFBzIDsgUHMgXFx8IFB0IFNUXCIgICAgICAgICAgIFwiRGVmaW5pdGlvbnMgZm9yIHVzZXItZGVmaW5lZCBrZXlzLlwiXG4vLyBAdnQ6ICNOICBEQ1MgICBYVEdFVFRDQVAgICBcIlJlcXVlc3QgVGVybWluZm8gU3RyaW5nXCIgXCJEQ1MgKyBxIFB0IFNUXCIgICAgICAgICAgICAgICAgIFwiUmVxdWVzdCBUZXJtaW5mbyBTdHJpbmcuXCJcbi8vIEB2dDogI04gIERDUyAgIFhUU0VUVENBUCAgIFwiU2V0IFRlcm1pbmZvIERhdGFcIiAgICAgICBcIkRDUyArIHAgUHQgU1RcIiAgICAgICAgICAgICAgICAgXCJTZXQgVGVybWluZm8gRGF0YS5cIlxuLy8gQHZ0OiAjTiAgT1NDICAgMSAgICAgICAgICAgXCJTZXQgSWNvbiBOYW1lXCIgICAgICAgICAgIFwiT1NDIDEgOyBQdCBCRUxcIiAgICAgICAgICAgICAgICBcIlNldCBpY29uIG5hbWUuXCJcblxuLyoqXG4gKiBNYXggbGVuZ3RoIG9mIHRoZSBVVEYzMiBpbnB1dCBidWZmZXIuIFJlYWwgbWVtb3J5IGNvbnN1bXB0aW9uIGlzIDQgdGltZXMgaGlnaGVyLlxuICovXG5jb25zdCBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIID0gMTMxMDcyO1xuXG4vKipcbiAqIExpbWl0IGxlbmd0aCBvZiB0aXRsZSBhbmQgaWNvbiBuYW1lIHN0YWNrcy5cbiAqL1xuY29uc3QgU1RBQ0tfTElNSVQgPSAxMDtcblxuLy8gbWFwIHBhcmFtcyB0byB3aW5kb3cgb3B0aW9uXG5mdW5jdGlvbiBwYXJhbVRvV2luZG93T3B0aW9uKG46IG51bWJlciwgb3B0czogSVdpbmRvd09wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG4gPiAyNCkge1xuICAgIHJldHVybiBvcHRzLnNldFdpbkxpbmVzIHx8IGZhbHNlO1xuICB9XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgMTogcmV0dXJuICEhb3B0cy5yZXN0b3JlV2luO1xuICAgIGNhc2UgMjogcmV0dXJuICEhb3B0cy5taW5pbWl6ZVdpbjtcbiAgICBjYXNlIDM6IHJldHVybiAhIW9wdHMuc2V0V2luUG9zaXRpb247XG4gICAgY2FzZSA0OiByZXR1cm4gISFvcHRzLnNldFdpblNpemVQaXhlbHM7XG4gICAgY2FzZSA1OiByZXR1cm4gISFvcHRzLnJhaXNlV2luO1xuICAgIGNhc2UgNjogcmV0dXJuICEhb3B0cy5sb3dlcldpbjtcbiAgICBjYXNlIDc6IHJldHVybiAhIW9wdHMucmVmcmVzaFdpbjtcbiAgICBjYXNlIDg6IHJldHVybiAhIW9wdHMuc2V0V2luU2l6ZUNoYXJzO1xuICAgIGNhc2UgOTogcmV0dXJuICEhb3B0cy5tYXhpbWl6ZVdpbjtcbiAgICBjYXNlIDEwOiByZXR1cm4gISFvcHRzLmZ1bGxzY3JlZW5XaW47XG4gICAgY2FzZSAxMTogcmV0dXJuICEhb3B0cy5nZXRXaW5TdGF0ZTtcbiAgICBjYXNlIDEzOiByZXR1cm4gISFvcHRzLmdldFdpblBvc2l0aW9uO1xuICAgIGNhc2UgMTQ6IHJldHVybiAhIW9wdHMuZ2V0V2luU2l6ZVBpeGVscztcbiAgICBjYXNlIDE1OiByZXR1cm4gISFvcHRzLmdldFNjcmVlblNpemVQaXhlbHM7XG4gICAgY2FzZSAxNjogcmV0dXJuICEhb3B0cy5nZXRDZWxsU2l6ZVBpeGVscztcbiAgICBjYXNlIDE4OiByZXR1cm4gISFvcHRzLmdldFdpblNpemVDaGFycztcbiAgICBjYXNlIDE5OiByZXR1cm4gISFvcHRzLmdldFNjcmVlblNpemVDaGFycztcbiAgICBjYXNlIDIwOiByZXR1cm4gISFvcHRzLmdldEljb25UaXRsZTtcbiAgICBjYXNlIDIxOiByZXR1cm4gISFvcHRzLmdldFdpblRpdGxlO1xuICAgIGNhc2UgMjI6IHJldHVybiAhIW9wdHMucHVzaFRpdGxlO1xuICAgIGNhc2UgMjM6IHJldHVybiAhIW9wdHMucG9wVGl0bGU7XG4gICAgY2FzZSAyNDogcmV0dXJuICEhb3B0cy5zZXRXaW5MaW5lcztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBlbnVtIFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZSB7XG4gIEdFVF9XSU5fU0laRV9QSVhFTFMgPSAwLFxuICBHRVRfQ0VMTF9TSVpFX1BJWEVMUyA9IDFcbn1cblxuLy8gY3JlYXRlIGEgd2FybmluZyBsb2cgaWYgYW4gYXN5bmMgaGFuZGxlciB0YWtlcyBsb25nZXIgdGhhbiB0aGUgbGltaXQgKGluIG1zKVxuY29uc3QgU0xPV19BU1lOQ19MSU1JVCA9IDUwMDA7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICR0ZW1wID0gMDtcblxuLyoqXG4gKiBUaGUgdGVybWluYWwncyBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBJSW5wdXRIYW5kbGVyLCB0aGlzIGhhbmRsZXMgYWxsXG4gKiBpbnB1dCBmcm9tIHRoZSBQYXJzZXIuXG4gKlxuICogUmVmZXIgdG8gaHR0cDovL2ludmlzaWJsZS1pc2xhbmQubmV0L3h0ZXJtL2N0bHNlcXMvY3Rsc2Vxcy5odG1sIHRvIHVuZGVyc3RhbmRcbiAqIGVhY2ggZnVuY3Rpb24ncyBoZWFkZXIgY29tbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIElucHV0SGFuZGxlciBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJSW5wdXRIYW5kbGVyIHtcbiAgcHJpdmF0ZSBfcGFyc2VCdWZmZXI6IFVpbnQzMkFycmF5ID0gbmV3IFVpbnQzMkFycmF5KDQwOTYpO1xuICBwcml2YXRlIF9zdHJpbmdEZWNvZGVyOiBTdHJpbmdUb1V0ZjMyID0gbmV3IFN0cmluZ1RvVXRmMzIoKTtcbiAgcHJpdmF0ZSBfdXRmOERlY29kZXI6IFV0ZjhUb1V0ZjMyID0gbmV3IFV0ZjhUb1V0ZjMyKCk7XG4gIHByaXZhdGUgX3dvcmtDZWxsOiBDZWxsRGF0YSA9IG5ldyBDZWxsRGF0YSgpO1xuICBwcml2YXRlIF93aW5kb3dUaXRsZSA9ICcnO1xuICBwcml2YXRlIF9pY29uTmFtZSA9ICcnO1xuICBwcml2YXRlIF9kaXJ0eVJvd1RyYWNrZXI6IElEaXJ0eVJvd1RyYWNrZXI7XG4gIHByb3RlY3RlZCBfd2luZG93VGl0bGVTdGFjazogc3RyaW5nW10gPSBbXTtcbiAgcHJvdGVjdGVkIF9pY29uTmFtZVN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgX2N1ckF0dHJEYXRhOiBJQXR0cmlidXRlRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG4gIHB1YmxpYyBnZXRBdHRyRGF0YSgpOiBJQXR0cmlidXRlRGF0YSB7IHJldHVybiB0aGlzLl9jdXJBdHRyRGF0YTsgfVxuICBwcml2YXRlIF9lcmFzZUF0dHJEYXRhSW50ZXJuYWw6IElBdHRyaWJ1dGVEYXRhID0gREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKTtcblxuICBwcml2YXRlIF9hY3RpdmVCdWZmZXI6IElCdWZmZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0QmVsbCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdEJlbGwgPSB0aGlzLl9vblJlcXVlc3RCZWxsLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZWZyZXNoUm93cyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXIsIG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RSZWZyZXNoUm93cyA9IHRoaXMuX29uUmVxdWVzdFJlZnJlc2hSb3dzLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RSZXNldCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFJlc2V0ID0gdGhpcy5fb25SZXF1ZXN0UmVzZXQuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVxdWVzdFNlbmRGb2N1cyA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFNlbmRGb2N1cyA9IHRoaXMuX29uUmVxdWVzdFNlbmRGb2N1cy5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0U3luY1Njcm9sbEJhciA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uUmVxdWVzdFN5bmNTY3JvbGxCYXIgPSB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxXaW5kb3dzT3B0aW9uc1JlcG9ydFR5cGU+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQgPSB0aGlzLl9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydC5ldmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkExMXlDaGFyID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkExMXlDaGFyID0gdGhpcy5fb25BMTF5Q2hhci5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25BMTF5VGFiID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkExMXlUYWIgPSB0aGlzLl9vbkExMXlUYWIuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ3Vyc29yTW92ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQ3Vyc29yTW92ZSA9IHRoaXMuX29uQ3Vyc29yTW92ZS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25MaW5lRmVlZCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uTGluZUZlZWQgPSB0aGlzLl9vbkxpbmVGZWVkLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNjcm9sbCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25TY3JvbGwgPSB0aGlzLl9vblNjcm9sbC5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25UaXRsZUNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25UaXRsZUNoYW5nZSA9IHRoaXMuX29uVGl0bGVDaGFuZ2UuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ29sb3IgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUNvbG9yRXZlbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Db2xvciA9IHRoaXMuX29uQ29sb3IuZXZlbnQ7XG5cbiAgcHJpdmF0ZSBfcGFyc2VTdGFjazogSVBhcnNlU3RhY2sgPSB7XG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBjdXJzb3JTdGFydFg6IDAsXG4gICAgY3Vyc29yU3RhcnRZOiAwLFxuICAgIGRlY29kZWRMZW5ndGg6IDAsXG4gICAgcG9zaXRpb246IDBcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFyc2V0U2VydmljZTogSUNoYXJzZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbG9nU2VydmljZTogSUxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uc1NlcnZpY2U6IElPcHRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vc2NMaW5rU2VydmljZTogSU9zY0xpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVNb3VzZVNlcnZpY2U6IElDb3JlTW91c2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3VuaWNvZGVTZXJ2aWNlOiBJVW5pY29kZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcGFyc2VyOiBJRXNjYXBlU2VxdWVuY2VQYXJzZXIgPSBuZXcgRXNjYXBlU2VxdWVuY2VQYXJzZXIoKVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fcGFyc2VyKTtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIgPSBuZXcgRGlydHlSb3dUcmFja2VyKHRoaXMuX2J1ZmZlclNlcnZpY2UpO1xuXG4gICAgLy8gVHJhY2sgcHJvcGVydGllcyB1c2VkIGluIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGNvZGUgbWFudWFsbHkgdG8gYXZvaWQgdXNpbmcgc2xvdyBnZXR0ZXJzXG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZShlID0+IHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IGUuYWN0aXZlQnVmZmVyKSk7XG5cbiAgICAvKipcbiAgICAgKiBjdXN0b20gZmFsbGJhY2sgaGFuZGxlcnNcbiAgICAgKi9cbiAgICB0aGlzLl9wYXJzZXIuc2V0Q3NpSGFuZGxlckZhbGxiYWNrKChpZGVudCwgcGFyYW1zKSA9PiB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmtub3duIENTSSBjb2RlOiAnLCB7IGlkZW50aWZpZXI6IHRoaXMuX3BhcnNlci5pZGVudFRvU3RyaW5nKGlkZW50KSwgcGFyYW1zOiBwYXJhbXMudG9BcnJheSgpIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFc2NIYW5kbGVyRmFsbGJhY2soaWRlbnQgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBFU0MgY29kZTogJywgeyBpZGVudGlmaWVyOiB0aGlzLl9wYXJzZXIuaWRlbnRUb1N0cmluZyhpZGVudCkgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2soY29kZSA9PiB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdVbmtub3duIEVYRUNVVEUgY29kZTogJywgeyBjb2RlIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuX3BhcnNlci5zZXRPc2NIYW5kbGVyRmFsbGJhY2soKGlkZW50aWZpZXIsIGFjdGlvbiwgZGF0YSkgPT4ge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBPU0MgY29kZTogJywgeyBpZGVudGlmaWVyLCBhY3Rpb24sIGRhdGEgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldERjc0hhbmRsZXJGYWxsYmFjaygoaWRlbnQsIGFjdGlvbiwgcGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKGFjdGlvbiA9PT0gJ0hPT0snKSB7XG4gICAgICAgIHBheWxvYWQgPSBwYXlsb2FkLnRvQXJyYXkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1Vua25vd24gRENTIGNvZGU6ICcsIHsgaWRlbnRpZmllcjogdGhpcy5fcGFyc2VyLmlkZW50VG9TdHJpbmcoaWRlbnQpLCBhY3Rpb24sIHBheWxvYWQgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBwcmludCBoYW5kbGVyXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnNldFByaW50SGFuZGxlcigoZGF0YSwgc3RhcnQsIGVuZCkgPT4gdGhpcy5wcmludChkYXRhLCBzdGFydCwgZW5kKSk7XG5cbiAgICAvKipcbiAgICAgKiBDU0kgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0AnIH0sIHBhcmFtcyA9PiB0aGlzLmluc2VydENoYXJzKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnICcsIGZpbmFsOiAnQCcgfSwgcGFyYW1zID0+IHRoaXMuc2Nyb2xsTGVmdChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdBJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JVcChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyAnLCBmaW5hbDogJ0EnIH0sIHBhcmFtcyA9PiB0aGlzLnNjcm9sbFJpZ2h0KHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0InIH0sIHBhcmFtcyA9PiB0aGlzLmN1cnNvckRvd24ocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnQycgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yRm9yd2FyZChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdEJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JCYWNrd2FyZChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdFJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JOZXh0TGluZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdGJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JQcmVjZWRpbmdMaW5lKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0cnIH0sIHBhcmFtcyA9PiB0aGlzLmN1cnNvckNoYXJBYnNvbHV0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdIJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JQb3NpdGlvbihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdJJyB9LCBwYXJhbXMgPT4gdGhpcy5jdXJzb3JGb3J3YXJkVGFiKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ0onIH0sIHBhcmFtcyA9PiB0aGlzLmVyYXNlSW5EaXNwbGF5KHBhcmFtcywgZmFsc2UpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgcHJlZml4OiAnPycsIGZpbmFsOiAnSicgfSwgcGFyYW1zID0+IHRoaXMuZXJhc2VJbkRpc3BsYXkocGFyYW1zLCB0cnVlKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnSycgfSwgcGFyYW1zID0+IHRoaXMuZXJhc2VJbkxpbmUocGFyYW1zLCBmYWxzZSkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBwcmVmaXg6ICc/JywgZmluYWw6ICdLJyB9LCBwYXJhbXMgPT4gdGhpcy5lcmFzZUluTGluZShwYXJhbXMsIHRydWUpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdMJyB9LCBwYXJhbXMgPT4gdGhpcy5pbnNlcnRMaW5lcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdNJyB9LCBwYXJhbXMgPT4gdGhpcy5kZWxldGVMaW5lcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdQJyB9LCBwYXJhbXMgPT4gdGhpcy5kZWxldGVDaGFycyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdTJyB9LCBwYXJhbXMgPT4gdGhpcy5zY3JvbGxVcChwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdUJyB9LCBwYXJhbXMgPT4gdGhpcy5zY3JvbGxEb3duKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ1gnIH0sIHBhcmFtcyA9PiB0aGlzLmVyYXNlQ2hhcnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnWicgfSwgcGFyYW1zID0+IHRoaXMuY3Vyc29yQmFja3dhcmRUYWIocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAnYCcgfSwgcGFyYW1zID0+IHRoaXMuY2hhclBvc0Fic29sdXRlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2EnIH0sIHBhcmFtcyA9PiB0aGlzLmhQb3NpdGlvblJlbGF0aXZlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2InIH0sIHBhcmFtcyA9PiB0aGlzLnJlcGVhdFByZWNlZGluZ0NoYXJhY3RlcihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdjJyB9LCBwYXJhbXMgPT4gdGhpcy5zZW5kRGV2aWNlQXR0cmlidXRlc1ByaW1hcnkocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz4nLCBmaW5hbDogJ2MnIH0sIHBhcmFtcyA9PiB0aGlzLnNlbmREZXZpY2VBdHRyaWJ1dGVzU2Vjb25kYXJ5KHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2QnIH0sIHBhcmFtcyA9PiB0aGlzLmxpbmVQb3NBYnNvbHV0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdlJyB9LCBwYXJhbXMgPT4gdGhpcy52UG9zaXRpb25SZWxhdGl2ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdmJyB9LCBwYXJhbXMgPT4gdGhpcy5oVlBvc2l0aW9uKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2cnIH0sIHBhcmFtcyA9PiB0aGlzLnRhYkNsZWFyKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2gnIH0sIHBhcmFtcyA9PiB0aGlzLnNldE1vZGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBmaW5hbDogJ2gnIH0sIHBhcmFtcyA9PiB0aGlzLnNldE1vZGVQcml2YXRlKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ2wnIH0sIHBhcmFtcyA9PiB0aGlzLnJlc2V0TW9kZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgcHJlZml4OiAnPycsIGZpbmFsOiAnbCcgfSwgcGFyYW1zID0+IHRoaXMucmVzZXRNb2RlUHJpdmF0ZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdtJyB9LCBwYXJhbXMgPT4gdGhpcy5jaGFyQXR0cmlidXRlcyhwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICduJyB9LCBwYXJhbXMgPT4gdGhpcy5kZXZpY2VTdGF0dXMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBmaW5hbDogJ24nIH0sIHBhcmFtcyA9PiB0aGlzLmRldmljZVN0YXR1c1ByaXZhdGUocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICchJywgZmluYWw6ICdwJyB9LCBwYXJhbXMgPT4gdGhpcy5zb2Z0UmVzZXQocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcgJywgZmluYWw6ICdxJyB9LCBwYXJhbXMgPT4gdGhpcy5zZXRDdXJzb3JTdHlsZShwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICdyJyB9LCBwYXJhbXMgPT4gdGhpcy5zZXRTY3JvbGxSZWdpb24ocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGZpbmFsOiAncycgfSwgcGFyYW1zID0+IHRoaXMuc2F2ZUN1cnNvcihwYXJhbXMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKHsgZmluYWw6ICd0JyB9LCBwYXJhbXMgPT4gdGhpcy53aW5kb3dPcHRpb25zKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBmaW5hbDogJ3UnIH0sIHBhcmFtcyA9PiB0aGlzLnJlc3RvcmVDdXJzb3IocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICdcXCcnLCBmaW5hbDogJ30nIH0sIHBhcmFtcyA9PiB0aGlzLmluc2VydENvbHVtbnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICdcXCcnLCBmaW5hbDogJ34nIH0sIHBhcmFtcyA9PiB0aGlzLmRlbGV0ZUNvbHVtbnMocGFyYW1zKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICdcIicsIGZpbmFsOiAncScgfSwgcGFyYW1zID0+IHRoaXMuc2VsZWN0UHJvdGVjdGVkKHBhcmFtcykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckNzaUhhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnJCcsIGZpbmFsOiAncCcgfSwgcGFyYW1zID0+IHRoaXMucmVxdWVzdE1vZGUocGFyYW1zLCB0cnVlKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyQ3NpSGFuZGxlcih7IHByZWZpeDogJz8nLCBpbnRlcm1lZGlhdGVzOiAnJCcsIGZpbmFsOiAncCcgfSwgcGFyYW1zID0+IHRoaXMucmVxdWVzdE1vZGUocGFyYW1zLCBmYWxzZSkpO1xuXG4gICAgLyoqXG4gICAgICogZXhlY3V0ZSBoYW5kbGVyXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLkJFTCwgKCkgPT4gdGhpcy5iZWxsKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5MRiwgKCkgPT4gdGhpcy5saW5lRmVlZCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuVlQsICgpID0+IHRoaXMubGluZUZlZWQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLkZGLCAoKSA9PiB0aGlzLmxpbmVGZWVkKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5DUiwgKCkgPT4gdGhpcy5jYXJyaWFnZVJldHVybigpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzAuQlMsICgpID0+IHRoaXMuYmFja3NwYWNlKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5IVCwgKCkgPT4gdGhpcy50YWIoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMwLlNPLCAoKSA9PiB0aGlzLnNoaWZ0T3V0KCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMC5TSSwgKCkgPT4gdGhpcy5zaGlmdEluKCkpO1xuICAgIC8vIEZJWE1FOiAgIFdoYXQgZG8gdG8gd2l0aCBtaXNzaW5nPyBPbGQgY29kZSBqdXN0IGFkZGVkIHRob3NlIHRvIHByaW50LlxuXG4gICAgdGhpcy5fcGFyc2VyLnNldEV4ZWN1dGVIYW5kbGVyKEMxLklORCwgKCkgPT4gdGhpcy5pbmRleCgpKTtcbiAgICB0aGlzLl9wYXJzZXIuc2V0RXhlY3V0ZUhhbmRsZXIoQzEuTkVMLCAoKSA9PiB0aGlzLm5leHRMaW5lKCkpO1xuICAgIHRoaXMuX3BhcnNlci5zZXRFeGVjdXRlSGFuZGxlcihDMS5IVFMsICgpID0+IHRoaXMudGFiU2V0KCkpO1xuXG4gICAgLyoqXG4gICAgICogT1NDIGhhbmRsZXJcbiAgICAgKi9cbiAgICAvLyAgIDAgLSBpY29uIG5hbWUgKyB0aXRsZVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMCwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB7IHRoaXMuc2V0VGl0bGUoZGF0YSk7IHRoaXMuc2V0SWNvbk5hbWUoZGF0YSk7IHJldHVybiB0cnVlOyB9KSk7XG4gICAgLy8gICAxIC0gaWNvbiBuYW1lXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0SWNvbk5hbWUoZGF0YSkpKTtcbiAgICAvLyAgIDIgLSB0aXRsZVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMiwgbmV3IE9zY0hhbmRsZXIoZGF0YSA9PiB0aGlzLnNldFRpdGxlKGRhdGEpKSk7XG4gICAgLy8gICAzIC0gc2V0IHByb3BlcnR5IFggaW4gdGhlIGZvcm0gXCJwcm9wPXZhbHVlXCJcbiAgICAvLyAgIDQgLSBDaGFuZ2UgQ29sb3IgTnVtYmVyXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcig0LCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRJbmRleGVkQ29sb3IoZGF0YSkpKTtcbiAgICAvLyAgIDUgLSBDaGFuZ2UgU3BlY2lhbCBDb2xvciBOdW1iZXJcbiAgICAvLyAgIDYgLSBFbmFibGUvZGlzYWJsZSBTcGVjaWFsIENvbG9yIE51bWJlciBjXG4gICAgLy8gICA3IC0gY3VycmVudCBkaXJlY3Rvcnk/IChub3QgaW4geHRlcm0gc3BlYywgc2VlIGh0dHBzOi8vZ2l0bGFiLmNvbS9nbmFjaG1hbi9pdGVybTIvaXNzdWVzLzM5MzkpXG4gICAgLy8gICA4IC0gY3JlYXRlIGh5cGVybGluayAobm90IGluIHh0ZXJtIHNwZWMsIHNlZSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9lZ21vbnRrb2IvZWIxMTQyOTRlZmJjZDVhZGIxOTQ0YzlmM2NiNWZlZGEpXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcig4LCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0SHlwZXJsaW5rKGRhdGEpKSk7XG4gICAgLy8gIDEwIC0gQ2hhbmdlIFZUMTAwIHRleHQgZm9yZWdyb3VuZCBjb2xvciB0byBQdC5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDEwLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRGZ0NvbG9yKGRhdGEpKSk7XG4gICAgLy8gIDExIC0gQ2hhbmdlIFZUMTAwIHRleHQgYmFja2dyb3VuZCBjb2xvciB0byBQdC5cbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJPc2NIYW5kbGVyKDExLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMuc2V0T3JSZXBvcnRCZ0NvbG9yKGRhdGEpKSk7XG4gICAgLy8gIDEyIC0gQ2hhbmdlIHRleHQgY3Vyc29yIGNvbG9yIHRvIFB0LlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTIsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5zZXRPclJlcG9ydEN1cnNvckNvbG9yKGRhdGEpKSk7XG4gICAgLy8gIDEzIC0gQ2hhbmdlIG1vdXNlIGZvcmVncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE0IC0gQ2hhbmdlIG1vdXNlIGJhY2tncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE1IC0gQ2hhbmdlIFRla3Ryb25peCBmb3JlZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICAxNiAtIENoYW5nZSBUZWt0cm9uaXggYmFja2dyb3VuZCBjb2xvciB0byBQdC5cbiAgICAvLyAgMTcgLSBDaGFuZ2UgaGlnaGxpZ2h0IGJhY2tncm91bmQgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE4IC0gQ2hhbmdlIFRla3Ryb25peCBjdXJzb3IgY29sb3IgdG8gUHQuXG4gICAgLy8gIDE5IC0gQ2hhbmdlIGhpZ2hsaWdodCBmb3JlZ3JvdW5kIGNvbG9yIHRvIFB0LlxuICAgIC8vICA0NiAtIENoYW5nZSBMb2cgRmlsZSB0byBQdC5cbiAgICAvLyAgNTAgLSBTZXQgRm9udCB0byBQdC5cbiAgICAvLyAgNTEgLSByZXNlcnZlZCBmb3IgRW1hY3Mgc2hlbGwuXG4gICAgLy8gIDUyIC0gTWFuaXB1bGF0ZSBTZWxlY3Rpb24gRGF0YS5cbiAgICAvLyAxMDQgOyBjIC0gUmVzZXQgQ29sb3IgTnVtYmVyIGMuXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMDQsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5yZXN0b3JlSW5kZXhlZENvbG9yKGRhdGEpKSk7XG4gICAgLy8gMTA1IDsgYyAtIFJlc2V0IFNwZWNpYWwgQ29sb3IgTnVtYmVyIGMuXG4gICAgLy8gMTA2IDsgYzsgZiAtIEVuYWJsZS9kaXNhYmxlIFNwZWNpYWwgQ29sb3IgTnVtYmVyIGMuXG4gICAgLy8gMTEwIC0gUmVzZXQgVlQxMDAgdGV4dCBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTEwLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMucmVzdG9yZUZnQ29sb3IoZGF0YSkpKTtcbiAgICAvLyAxMTEgLSBSZXNldCBWVDEwMCB0ZXh0IGJhY2tncm91bmQgY29sb3IuXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcigxMTEsIG5ldyBPc2NIYW5kbGVyKGRhdGEgPT4gdGhpcy5yZXN0b3JlQmdDb2xvcihkYXRhKSkpO1xuICAgIC8vIDExMiAtIFJlc2V0IHRleHQgY3Vyc29yIGNvbG9yLlxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3Rlck9zY0hhbmRsZXIoMTEyLCBuZXcgT3NjSGFuZGxlcihkYXRhID0+IHRoaXMucmVzdG9yZUN1cnNvckNvbG9yKGRhdGEpKSk7XG4gICAgLy8gMTEzIC0gUmVzZXQgbW91c2UgZm9yZWdyb3VuZCBjb2xvci5cbiAgICAvLyAxMTQgLSBSZXNldCBtb3VzZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgIC8vIDExNSAtIFJlc2V0IFRla3Ryb25peCBmb3JlZ3JvdW5kIGNvbG9yLlxuICAgIC8vIDExNiAtIFJlc2V0IFRla3Ryb25peCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgIC8vIDExNyAtIFJlc2V0IGhpZ2hsaWdodCBjb2xvci5cbiAgICAvLyAxMTggLSBSZXNldCBUZWt0cm9uaXggY3Vyc29yIGNvbG9yLlxuICAgIC8vIDExOSAtIFJlc2V0IGhpZ2hsaWdodCBmb3JlZ3JvdW5kIGNvbG9yLlxuXG4gICAgLyoqXG4gICAgICogRVNDIGhhbmRsZXJzXG4gICAgICovXG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnNycgfSwgKCkgPT4gdGhpcy5zYXZlQ3Vyc29yKCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJzgnIH0sICgpID0+IHRoaXMucmVzdG9yZUN1cnNvcigpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdEJyB9LCAoKSA9PiB0aGlzLmluZGV4KCkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ0UnIH0sICgpID0+IHRoaXMubmV4dExpbmUoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnSCcgfSwgKCkgPT4gdGhpcy50YWJTZXQoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnTScgfSwgKCkgPT4gdGhpcy5yZXZlcnNlSW5kZXgoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnPScgfSwgKCkgPT4gdGhpcy5rZXlwYWRBcHBsaWNhdGlvbk1vZGUoKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnPicgfSwgKCkgPT4gdGhpcy5rZXlwYWROdW1lcmljTW9kZSgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICdjJyB9LCAoKSA9PiB0aGlzLmZ1bGxSZXNldCgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICduJyB9LCAoKSA9PiB0aGlzLnNldGdMZXZlbCgyKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnbycgfSwgKCkgPT4gdGhpcy5zZXRnTGV2ZWwoMykpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ3wnIH0sICgpID0+IHRoaXMuc2V0Z0xldmVsKDMpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgZmluYWw6ICd9JyB9LCAoKSA9PiB0aGlzLnNldGdMZXZlbCgyKSk7XG4gICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGZpbmFsOiAnficgfSwgKCkgPT4gdGhpcy5zZXRnTGV2ZWwoMSkpO1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnJScsIGZpbmFsOiAnQCcgfSwgKCkgPT4gdGhpcy5zZWxlY3REZWZhdWx0Q2hhcnNldCgpKTtcbiAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJyUnLCBmaW5hbDogJ0cnIH0sICgpID0+IHRoaXMuc2VsZWN0RGVmYXVsdENoYXJzZXQoKSk7XG4gICAgZm9yIChjb25zdCBmbGFnIGluIENIQVJTRVRTKSB7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJygnLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJygnICsgZmxhZykpO1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICcpJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCcpJyArIGZsYWcpKTtcbiAgICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnKicsIGZpbmFsOiBmbGFnIH0sICgpID0+IHRoaXMuc2VsZWN0Q2hhcnNldCgnKicgKyBmbGFnKSk7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJysnLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJysnICsgZmxhZykpO1xuICAgICAgdGhpcy5fcGFyc2VyLnJlZ2lzdGVyRXNjSGFuZGxlcih7IGludGVybWVkaWF0ZXM6ICctJywgZmluYWw6IGZsYWcgfSwgKCkgPT4gdGhpcy5zZWxlY3RDaGFyc2V0KCctJyArIGZsYWcpKTtcbiAgICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnLicsIGZpbmFsOiBmbGFnIH0sICgpID0+IHRoaXMuc2VsZWN0Q2hhcnNldCgnLicgKyBmbGFnKSk7XG4gICAgICB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKHsgaW50ZXJtZWRpYXRlczogJy8nLCBmaW5hbDogZmxhZyB9LCAoKSA9PiB0aGlzLnNlbGVjdENoYXJzZXQoJy8nICsgZmxhZykpOyAvLyBUT0RPOiBzdXBwb3J0ZWQ/XG4gICAgfVxuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckVzY0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnIycsIGZpbmFsOiAnOCcgfSwgKCkgPT4gdGhpcy5zY3JlZW5BbGlnbm1lbnRQYXR0ZXJuKCkpO1xuXG4gICAgLyoqXG4gICAgICogZXJyb3IgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5zZXRFcnJvckhhbmRsZXIoKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiB7XG4gICAgICB0aGlzLl9sb2dTZXJ2aWNlLmVycm9yKCdQYXJzaW5nIGVycm9yOiAnLCBzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBEQ1MgaGFuZGxlclxuICAgICAqL1xuICAgIHRoaXMuX3BhcnNlci5yZWdpc3RlckRjc0hhbmRsZXIoeyBpbnRlcm1lZGlhdGVzOiAnJCcsIGZpbmFsOiAncScgfSwgbmV3IERjc0hhbmRsZXIoKGRhdGEsIHBhcmFtcykgPT4gdGhpcy5yZXF1ZXN0U3RhdHVzU3RyaW5nKGRhdGEsIHBhcmFtcykpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luYyBwYXJzZSBzdXBwb3J0LlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJlc2VydmVTdGFjayhjdXJzb3JTdGFydFg6IG51bWJlciwgY3Vyc29yU3RhcnRZOiBudW1iZXIsIGRlY29kZWRMZW5ndGg6IG51bWJlciwgcG9zaXRpb246IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX3BhcnNlU3RhY2sucGF1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WCA9IGN1cnNvclN0YXJ0WDtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WSA9IGN1cnNvclN0YXJ0WTtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmRlY29kZWRMZW5ndGggPSBkZWNvZGVkTGVuZ3RoO1xuICAgIHRoaXMuX3BhcnNlU3RhY2sucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgX2xvZ1Nsb3dSZXNvbHZpbmdBc3luYyhwOiBQcm9taXNlPGJvb2xlYW4+KTogdm9pZCB7XG4gICAgLy8gbG9nIGEgbGltaXRlZCB3YXJuaW5nIGFib3V0IGFuIGFzeW5jIGhhbmRsZXIgdGFraW5nIHRvbyBsb25nXG4gICAgaWYgKHRoaXMuX2xvZ1NlcnZpY2UubG9nTGV2ZWwgPD0gTG9nTGV2ZWxFbnVtLldBUk4pIHtcbiAgICAgIFByb21pc2UucmFjZShbcCwgbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlaignI1NMT1dfVElNRU9VVCcpLCBTTE9XX0FTWU5DX0xJTUlUKSldKVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBpZiAoZXJyICE9PSAnI1NMT1dfVElNRU9VVCcpIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS53YXJuKGBhc3luYyBwYXJzZXIgaGFuZGxlciB0YWtpbmcgbG9uZ2VyIHRoYW4gJHtTTE9XX0FTWU5DX0xJTUlUfSBtc2ApO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRDdXJyZW50TGlua0lkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLnVybElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGNhbGwgd2l0aCBhc3luYyBoYW5kbGVyIHN1cHBvcnQuXG4gICAqXG4gICAqIFdoZXRoZXIgdGhlIHN0YWNrIHN0YXRlIGdvdCBwcmVzZXJ2ZWQgZm9yIHRoZSBuZXh0IGNhbGwsIGlzIGluZGljYXRlZCBieSB0aGUgcmV0dXJuIHZhbHVlOlxuICAgKiAtIHVuZGVmaW5lZCAodm9pZCk6XG4gICAqICAgYWxsIGhhbmRsZXJzIHdlcmUgc3luYywgbm8gc3RhY2sgc2F2ZSwgY29udGludWUgbm9ybWFsbHkgd2l0aCBuZXh0IGNodW5rXG4gICAqIC0gUHJvbWlzZVxcPGJvb2xlYW5cXD46XG4gICAqICAgZXhlY3V0aW9uIHN0b3BwZWQgYXQgYXN5bmMgaGFuZGxlciwgc3RhY2sgc2F2ZWQsIGNvbnRpbnVlIHdpdGggc2FtZSBjaHVuayBhbmQgdGhlIHByb21pc2VcbiAgICogICByZXNvbHZlIHZhbHVlIGFzIGBwcm9taXNlUmVzdWx0YCB1bnRpbCB0aGUgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICpcbiAgICogTm90ZTogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IGBUZXJtaW5hbC53cml0ZWAgdG8gZW5zdXJlIGNvcnJlY3QgZXhlY3V0aW9uIG9yZGVyXG4gICAqIGFuZCBwcm9wZXIgY29udGludWF0aW9uIG9mIGFzeW5jIHBhcnNlciBoYW5kbGVycy5cbiAgICovXG4gIHB1YmxpYyBwYXJzZShkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBwcm9taXNlUmVzdWx0PzogYm9vbGVhbik6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmVzdWx0OiB2b2lkIHwgUHJvbWlzZTxib29sZWFuPjtcbiAgICBsZXQgY3Vyc29yU3RhcnRYID0gdGhpcy5fYWN0aXZlQnVmZmVyLng7XG4gICAgbGV0IGN1cnNvclN0YXJ0WSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55O1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgY29uc3Qgd2FzUGF1c2VkID0gdGhpcy5fcGFyc2VTdGFjay5wYXVzZWQ7XG5cbiAgICBpZiAod2FzUGF1c2VkKSB7XG4gICAgICAvLyBhc3N1bXB0aW9uOiBfcGFyc2VCdWZmZXIgbmV2ZXIgbXV0YXRlcyBiZXR3ZWVuIGFzeW5jIGNhbGxzXG4gICAgICBpZiAocmVzdWx0ID0gdGhpcy5fcGFyc2VyLnBhcnNlKHRoaXMuX3BhcnNlQnVmZmVyLCB0aGlzLl9wYXJzZVN0YWNrLmRlY29kZWRMZW5ndGgsIHByb21pc2VSZXN1bHQpKSB7XG4gICAgICAgIHRoaXMuX2xvZ1Nsb3dSZXNvbHZpbmdBc3luYyhyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgY3Vyc29yU3RhcnRYID0gdGhpcy5fcGFyc2VTdGFjay5jdXJzb3JTdGFydFg7XG4gICAgICBjdXJzb3JTdGFydFkgPSB0aGlzLl9wYXJzZVN0YWNrLmN1cnNvclN0YXJ0WTtcbiAgICAgIHRoaXMuX3BhcnNlU3RhY2sucGF1c2VkID0gZmFsc2U7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBNQVhfUEFSU0VCVUZGRVJfTEVOR1RIKSB7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5fcGFyc2VTdGFjay5wb3NpdGlvbiArIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9nIGRlYnVnIGRhdGEsIHRoZSBsb2cgbGV2ZWwgZ2F0ZSBpcyB0byBwcmV2ZW50IGV4dHJhIHdvcmsgaW4gdGhpcyBob3QgcGF0aFxuICAgIGlmICh0aGlzLl9sb2dTZXJ2aWNlLmxvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5ERUJVRykge1xuICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZyhgcGFyc2luZyBkYXRhJHt0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBgIFwiJHtkYXRhfVwiYCA6IGAgXCIke0FycmF5LnByb3RvdHlwZS5tYXAuY2FsbChkYXRhLCBlID0+IFN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLmpvaW4oJycpfVwiYH1gLCB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBkYXRhLnNwbGl0KCcnKS5tYXAoZSA9PiBlLmNoYXJDb2RlQXQoMCkpXG4gICAgICAgIDogZGF0YVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyByZXNpemUgaW5wdXQgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGlmICh0aGlzLl9wYXJzZUJ1ZmZlci5sZW5ndGggPCBkYXRhLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX3BhcnNlQnVmZmVyLmxlbmd0aCA8IE1BWF9QQVJTRUJVRkZFUl9MRU5HVEgpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VCdWZmZXIgPSBuZXcgVWludDMyQXJyYXkoTWF0aC5taW4oZGF0YS5sZW5ndGgsIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciB0aGUgZGlydHkgcm93IHNlcnZpY2Ugc28gd2Uga25vdyB3aGljaCBsaW5lcyBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHBhcnNpbmdcbiAgICAvLyBJbXBvcnRhbnQ6IGRvIG5vdCBjbGVhciBiZXR3ZWVuIGFzeW5jIGNhbGxzLCBvdGhlcndpc2Ugd2UgbG9zdCBwZW5kaW5nIHVwZGF0ZSBpbmZvcm1hdGlvbi5cbiAgICBpZiAoIXdhc1BhdXNlZCkge1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLmNsZWFyUmFuZ2UoKTtcbiAgICB9XG5cbiAgICAvLyBwcm9jZXNzIGJpZyBkYXRhIGluIHNtYWxsZXIgY2h1bmtzXG4gICAgaWYgKGRhdGEubGVuZ3RoID4gTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCkge1xuICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCkge1xuICAgICAgICBjb25zdCBlbmQgPSBpICsgTUFYX1BBUlNFQlVGRkVSX0xFTkdUSCA8IGRhdGEubGVuZ3RoID8gaSArIE1BWF9QQVJTRUJVRkZFUl9MRU5HVEggOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbGVuID0gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJylcbiAgICAgICAgICA/IHRoaXMuX3N0cmluZ0RlY29kZXIuZGVjb2RlKGRhdGEuc3Vic3RyaW5nKGksIGVuZCksIHRoaXMuX3BhcnNlQnVmZmVyKVxuICAgICAgICAgIDogdGhpcy5fdXRmOERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoaSwgZW5kKSwgdGhpcy5fcGFyc2VCdWZmZXIpO1xuICAgICAgICBpZiAocmVzdWx0ID0gdGhpcy5fcGFyc2VyLnBhcnNlKHRoaXMuX3BhcnNlQnVmZmVyLCBsZW4pKSB7XG4gICAgICAgICAgdGhpcy5fcHJlc2VydmVTdGFjayhjdXJzb3JTdGFydFgsIGN1cnNvclN0YXJ0WSwgbGVuLCBpKTtcbiAgICAgICAgICB0aGlzLl9sb2dTbG93UmVzb2x2aW5nQXN5bmMocmVzdWx0KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghd2FzUGF1c2VkKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9ICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgPyB0aGlzLl9zdHJpbmdEZWNvZGVyLmRlY29kZShkYXRhLCB0aGlzLl9wYXJzZUJ1ZmZlcilcbiAgICAgICAgICA6IHRoaXMuX3V0ZjhEZWNvZGVyLmRlY29kZShkYXRhLCB0aGlzLl9wYXJzZUJ1ZmZlcik7XG4gICAgICAgIGlmIChyZXN1bHQgPSB0aGlzLl9wYXJzZXIucGFyc2UodGhpcy5fcGFyc2VCdWZmZXIsIGxlbikpIHtcbiAgICAgICAgICB0aGlzLl9wcmVzZXJ2ZVN0YWNrKGN1cnNvclN0YXJ0WCwgY3Vyc29yU3RhcnRZLCBsZW4sIDApO1xuICAgICAgICAgIHRoaXMuX2xvZ1Nsb3dSZXNvbHZpbmdBc3luYyhyZXN1bHQpO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggIT09IGN1cnNvclN0YXJ0WCB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSAhPT0gY3Vyc29yU3RhcnRZKSB7XG4gICAgICB0aGlzLl9vbkN1cnNvck1vdmUuZmlyZSgpO1xuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggYW55IGRpcnR5IHJvd3MgYWNjdW11bGF0ZWQgYXMgcGFydCBvZiBwYXJzaW5nLCBmaXJlIG9ubHkgZm9yIHJvd3Mgd2l0aGluIHRoZVxuICAgIC8vIF92aWV3cG9ydF8gd2hpY2ggaXMgcmVsYXRpdmUgdG8geWRpc3AsIG5vdCByZWxhdGl2ZSB0byB5YmFzZS5cbiAgICBjb25zdCB2aWV3cG9ydEVuZCA9IHRoaXMuX2RpcnR5Um93VHJhY2tlci5lbmQgKyAodGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgLSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55ZGlzcCk7XG4gICAgY29uc3Qgdmlld3BvcnRTdGFydCA9IHRoaXMuX2RpcnR5Um93VHJhY2tlci5zdGFydCArICh0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci55YmFzZSAtIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnlkaXNwKTtcbiAgICBpZiAodmlld3BvcnRTdGFydCA8IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZmlyZShNYXRoLm1pbih2aWV3cG9ydFN0YXJ0LCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKSwgTWF0aC5taW4odmlld3BvcnRFbmQsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcHJpbnQoZGF0YTogVWludDMyQXJyYXksIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGNvZGU6IG51bWJlcjtcbiAgICBsZXQgY2hXaWR0aDogbnVtYmVyO1xuICAgIGNvbnN0IGNoYXJzZXQgPSB0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0O1xuICAgIGNvbnN0IHNjcmVlblJlYWRlck1vZGUgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGU7XG4gICAgY29uc3QgY29scyA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICBjb25zdCB3cmFwYXJvdW5kTW9kZSA9IHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kO1xuICAgIGNvbnN0IGluc2VydE1vZGUgPSB0aGlzLl9jb3JlU2VydmljZS5tb2Rlcy5pbnNlcnRNb2RlO1xuICAgIGNvbnN0IGN1ckF0dHIgPSB0aGlzLl9jdXJBdHRyRGF0YTtcbiAgICBsZXQgYnVmZmVyUm93ID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhO1xuXG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG5cbiAgICAvLyBoYW5kbGUgd2lkZSBjaGFyczogcmVzZXQgc3RhcnRfY2VsbC0xIGlmIHdlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgc2Vjb25kIGNlbGwgb2YgYSB3aWRlIGNoYXJcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggJiYgZW5kIC0gc3RhcnQgPiAwICYmIGJ1ZmZlclJvdy5nZXRXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCAtIDEpID09PSAyKSB7XG4gICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLnggLSAxLCAwLCAxLCBjdXJBdHRyKTtcbiAgICB9XG5cbiAgICBsZXQgcHJlY2VkaW5nSm9pblN0YXRlID0gdGhpcy5fcGFyc2VyLnByZWNlZGluZ0pvaW5TdGF0ZTtcbiAgICBmb3IgKGxldCBwb3MgPSBzdGFydDsgcG9zIDwgZW5kOyArK3Bvcykge1xuICAgICAgY29kZSA9IGRhdGFbcG9zXTtcblxuICAgICAgLy8gZ2V0IGNoYXJzZXQgcmVwbGFjZW1lbnQgY2hhcmFjdGVyXG4gICAgICAvLyBjaGFyc2V0IGlzIG9ubHkgZGVmaW5lZCBmb3IgQVNDSUksIHRoZXJlZm9yZSB3ZSBvbmx5XG4gICAgICAvLyBzZWFyY2ggZm9yIGFuIHJlcGxhY2VtZW50IGNoYXIgaWYgY29kZSA8IDEyN1xuICAgICAgaWYgKGNvZGUgPCAxMjcgJiYgY2hhcnNldCkge1xuICAgICAgICBjb25zdCBjaCA9IGNoYXJzZXRbU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKV07XG4gICAgICAgIGlmIChjaCkge1xuICAgICAgICAgIGNvZGUgPSBjaC5jaGFyQ29kZUF0KDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRJbmZvID0gdGhpcy5fdW5pY29kZVNlcnZpY2UuY2hhclByb3BlcnRpZXMoY29kZSwgcHJlY2VkaW5nSm9pblN0YXRlKTtcbiAgICAgIGNoV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgoY3VycmVudEluZm8pO1xuICAgICAgY29uc3Qgc2hvdWxkSm9pbiA9IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RTaG91bGRKb2luKGN1cnJlbnRJbmZvKTtcbiAgICAgIGNvbnN0IG9sZFdpZHRoID0gc2hvdWxkSm9pbiA/IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aChwcmVjZWRpbmdKb2luU3RhdGUpIDogMDtcbiAgICAgIHByZWNlZGluZ0pvaW5TdGF0ZSA9IGN1cnJlbnRJbmZvO1xuXG4gICAgICBpZiAoc2NyZWVuUmVhZGVyTW9kZSkge1xuICAgICAgICB0aGlzLl9vbkExMXlDaGFyLmZpcmUoc3RyaW5nRnJvbUNvZGVQb2ludChjb2RlKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fZ2V0Q3VycmVudExpbmtJZCgpKSB7XG4gICAgICAgIHRoaXMuX29zY0xpbmtTZXJ2aWNlLmFkZExpbmVUb0xpbmsodGhpcy5fZ2V0Q3VycmVudExpbmtJZCgpLCB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGdvdG8gbmV4dCBsaW5lIGlmIGNoIHdvdWxkIG92ZXJmbG93XG4gICAgICAvLyBOT1RFOiBUbyBhdm9pZCBjb3N0bHkgd2lkdGggY2hlY2tzIGhlcmUsXG4gICAgICAvLyB0aGUgdGVybWluYWwgZG9lcyBub3QgYWxsb3cgYSBjb2xzIDwgMi5cbiAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCArIGNoV2lkdGggLSBvbGRXaWR0aCA+IGNvbHMpIHtcbiAgICAgICAgLy8gYXV0b3dyYXAgLSBERUNBV01cbiAgICAgICAgLy8gYXV0b21hdGljYWxseSB3cmFwcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmVcbiAgICAgICAgaWYgKHdyYXBhcm91bmRNb2RlKSB7XG4gICAgICAgICAgY29uc3Qgb2xkUm93ID0gYnVmZmVyUm93O1xuICAgICAgICAgIGxldCBvbGRDb2wgPSB0aGlzLl9hY3RpdmVCdWZmZXIueCAtIG9sZFdpZHRoO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gb2xkV2lkdGg7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkrKztcbiAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gKyAxKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueSA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgbGluZSBhbHJlYWR5IGV4aXN0cyAoZWcuIHRoZSBpbml0aWFsIHZpZXdwb3J0KSwgbWFyayBpdCBhcyBhXG4gICAgICAgICAgICAvLyB3cmFwcGVkIGxpbmVcbiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpIS5pc1dyYXBwZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByb3cgY2hhbmdlZCwgZ2V0IGl0IGFnYWluXG4gICAgICAgICAgYnVmZmVyUm93ID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhO1xuICAgICAgICAgIGlmIChvbGRXaWR0aCA+IDAgJiYgYnVmZmVyUm93IGluc3RhbmNlb2YgQnVmZmVyTGluZSkge1xuICAgICAgICAgICAgLy8gQ29tYmluaW5nIGNoYXJhY3RlciB3aWRlbnMgMSBjb2x1bW4gdG8gMi5cbiAgICAgICAgICAgIC8vIE1vdmUgb2xkIGNoYXJhY3RlciB0byBuZXh0IGxpbmUuXG4gICAgICAgICAgICBidWZmZXJSb3cuY29weUNlbGxzRnJvbShvbGRSb3cgYXMgQnVmZmVyTGluZSxcbiAgICAgICAgICAgICAgb2xkQ29sLCAwLCBvbGRXaWR0aCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjbGVhciBsZWZ0IG92ZXIgY2VsbHMgdG8gdGhlIHJpZ2h0XG4gICAgICAgICAgd2hpbGUgKG9sZENvbCA8IGNvbHMpIHtcbiAgICAgICAgICAgIG9sZFJvdy5zZXRDZWxsRnJvbUNvZGVwb2ludChvbGRDb2wrKywgMCwgMSwgY3VyQXR0cik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gY29scyAtIDE7XG4gICAgICAgICAgaWYgKGNoV2lkdGggPT09IDIpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBjaGVjayBmb3IgeHRlcm0gYmVoYXZpb3JcbiAgICAgICAgICAgIC8vIFdoYXQgdG8gZG8gaGVyZT8gV2UgZ290IGEgd2lkZSBjaGFyIHRoYXQgZG9lcyBub3QgZml0IGludG8gbGFzdCBjZWxsXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gaW5zZXJ0IGNvbWJpbmluZyBjaGFyIGF0IGxhc3QgY3Vyc29yIHBvc2l0aW9uXG4gICAgICAvLyB0aGlzLl9hY3RpdmVCdWZmZXIueCBzaG91bGQgbmV2ZXIgYmUgMCBmb3IgYSBjb21iaW5pbmcgY2hhclxuICAgICAgLy8gc2luY2UgdGhleSBhbHdheXMgZm9sbG93IGEgY2VsbCBjb25zdW1pbmcgY2hhclxuICAgICAgLy8gdGhlcmVmb3JlIHdlIGNhbiB0ZXN0IGZvciB0aGlzLl9hY3RpdmVCdWZmZXIueCB0byBhdm9pZCBvdmVyZmxvdyBsZWZ0XG4gICAgICBpZiAoc2hvdWxkSm9pbiAmJiB0aGlzLl9hY3RpdmVCdWZmZXIueCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBidWZmZXJSb3cuZ2V0V2lkdGgodGhpcy5fYWN0aXZlQnVmZmVyLnggLSAxKSA/IDEgOiAyO1xuICAgICAgICAvLyBpZiBlbXB0eSBjZWxsIGFmdGVyIGZ1bGx3aWR0aCwgbmVlZCB0byBnbyAyIGNlbGxzIGJhY2tcbiAgICAgICAgLy8gaXQgaXMgc2F2ZSB0byBzdGVwIDIgY2VsbHMgYmFjayBoZXJlXG4gICAgICAgIC8vIHNpbmNlIGFuIGVtcHR5IGNlbGwgaXMgb25seSBzZXQgYnkgZnVsbHdpZHRoIGNoYXJzXG4gICAgICAgIGJ1ZmZlclJvdy5hZGRDb2RlcG9pbnRUb0NlbGwodGhpcy5fYWN0aXZlQnVmZmVyLnggLSBvZmZzZXQsXG4gICAgICAgICAgY29kZSwgY2hXaWR0aCk7XG4gICAgICAgIGZvciAobGV0IGRlbHRhID0gY2hXaWR0aCAtIG9sZFdpZHRoOyAtLWRlbHRhID49IDA7ICkge1xuICAgICAgICAgIGJ1ZmZlclJvdy5zZXRDZWxsRnJvbUNvZGVwb2ludCh0aGlzLl9hY3RpdmVCdWZmZXIueCsrLCAwLCAwLCBjdXJBdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaW5zZXJ0IG1vZGU6IG1vdmUgY2hhcmFjdGVycyB0byByaWdodFxuICAgICAgaWYgKGluc2VydE1vZGUpIHtcbiAgICAgICAgLy8gcmlnaHQgc2hpZnQgY2VsbHMgYWNjb3JkaW5nIHRvIHRoZSB3aWR0aFxuICAgICAgICBidWZmZXJSb3cuaW5zZXJ0Q2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsIGNoV2lkdGggLSBvbGRXaWR0aCwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKGN1ckF0dHIpKTtcbiAgICAgICAgLy8gdGVzdCBsYXN0IGNlbGwgLSBzaW5jZSB0aGUgbGFzdCBjZWxsIGhhcyBvbmx5IHJvb20gZm9yXG4gICAgICAgIC8vIGEgaGFsZndpZHRoIGNoYXIgYW55IGZ1bGx3aWR0aCBzaGlmdGVkIHRoZXJlIGlzIGxvc3RcbiAgICAgICAgLy8gYW5kIHdpbGwgYmUgc2V0IHRvIGVtcHR5IGNlbGxcbiAgICAgICAgaWYgKGJ1ZmZlclJvdy5nZXRXaWR0aChjb2xzIC0gMSkgPT09IDIpIHtcbiAgICAgICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQoY29scyAtIDEsIE5VTExfQ0VMTF9DT0RFLCBOVUxMX0NFTExfV0lEVEgsIGN1ckF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHdyaXRlIGN1cnJlbnQgY2hhciB0byBidWZmZXIgYW5kIGFkdmFuY2UgY3Vyc29yXG4gICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngrKywgY29kZSwgY2hXaWR0aCwgY3VyQXR0cik7XG5cbiAgICAgIC8vIGZ1bGx3aWR0aCBjaGFyIC0gYWxzbyBzZXQgbmV4dCBjZWxsIHRvIHBsYWNlaG9sZGVyIHN0dWIgYW5kIGFkdmFuY2UgY3Vyc29yXG4gICAgICAvLyBmb3IgZ3JhcGhlbWVzIGJpZ2dlciB0aGFuIGZ1bGx3aWR0aCB3ZSBjYW4gc2ltcGx5IGxvb3AgdG8gemVyb1xuICAgICAgLy8gd2UgYWxyZWFkeSBtYWRlIHN1cmUgYWJvdmUsIHRoYXQgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyBjaFdpZHRoIHdpbGwgbm90IG92ZXJmbG93IHJpZ2h0XG4gICAgICBpZiAoY2hXaWR0aCA+IDApIHtcbiAgICAgICAgd2hpbGUgKC0tY2hXaWR0aCkge1xuICAgICAgICAgIC8vIG90aGVyIHRoYW4gYSByZWd1bGFyIGVtcHR5IGNlbGwgYSBjZWxsIGZvbGxvd2luZyBhIHdpZGUgY2hhciBoYXMgbm8gd2lkdGhcbiAgICAgICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngrKywgMCwgMCwgY3VyQXR0cik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9wYXJzZXIucHJlY2VkaW5nSm9pblN0YXRlID0gcHJlY2VkaW5nSm9pblN0YXRlO1xuXG4gICAgLy8gaGFuZGxlIHdpZGUgY2hhcnM6IHJlc2V0IGNlbGwgdG8gdGhlIHJpZ2h0IGlmIGl0IGlzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54IDwgY29scyAmJiBlbmQgLSBzdGFydCA+IDAgJiYgYnVmZmVyUm93LmdldFdpZHRoKHRoaXMuX2FjdGl2ZUJ1ZmZlci54KSA9PT0gMCAmJiAhYnVmZmVyUm93Lmhhc0NvbnRlbnQodGhpcy5fYWN0aXZlQnVmZmVyLngpKSB7XG4gICAgICBidWZmZXJSb3cuc2V0Q2VsbEZyb21Db2RlcG9pbnQodGhpcy5fYWN0aXZlQnVmZmVyLngsIDAsIDEsIGN1ckF0dHIpO1xuICAgIH1cblxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmQgcmVnaXN0ZXJDc2lIYW5kbGVyIGZyb20gcGFyc2VyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyQ3NpSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChwYXJhbXM6IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIGlmIChpZC5maW5hbCA9PT0gJ3QnICYmICFpZC5wcmVmaXggJiYgIWlkLmludGVybWVkaWF0ZXMpIHtcbiAgICAgIC8vIHNlY3VyaXR5OiBhbHdheXMgY2hlY2sgd2hldGhlciB3aW5kb3cgb3B0aW9uIGlzIGFsbG93ZWRcbiAgICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKGlkLCBwYXJhbXMgPT4ge1xuICAgICAgICBpZiAoIXBhcmFtVG9XaW5kb3dPcHRpb24ocGFyYW1zLnBhcmFtc1swXSwgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dPcHRpb25zKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhwYXJhbXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJDc2lIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRm9yd2FyZCByZWdpc3RlckRjc0hhbmRsZXIgZnJvbSBwYXJzZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZywgcGFyYW06IElQYXJhbXMpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJEY3NIYW5kbGVyKGlkLCBuZXcgRGNzSGFuZGxlcihjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcndhcmQgcmVnaXN0ZXJFc2NIYW5kbGVyIGZyb20gcGFyc2VyLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyRXNjSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9wYXJzZXIucmVnaXN0ZXJFc2NIYW5kbGVyKGlkLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRm9yd2FyZCByZWdpc3Rlck9zY0hhbmRsZXIgZnJvbSBwYXJzZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50OiBudW1iZXIsIGNhbGxiYWNrOiAoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyc2VyLnJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudCwgbmV3IE9zY0hhbmRsZXIoY2FsbGJhY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCRUxcbiAgICogQmVsbCAoQ3RybC1HKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIEJFTCAgIFwiQmVsbFwiICBcIlxcYSwgXFx4MDdcIiAgXCJSaW5nIHRoZSBiZWxsLlwiXG4gICAqIFRoZSBiZWhhdmlvciBvZiB0aGUgYmVsbCBpcyBmdXJ0aGVyIGN1c3RvbWl6YWJsZSB3aXRoIGBJVGVybWluYWxPcHRpb25zLmJlbGxTdHlsZWBcbiAgICogYW5kIGBJVGVybWluYWxPcHRpb25zLmJlbGxTb3VuZGAuXG4gICAqL1xuICBwdWJsaWMgYmVsbCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9vblJlcXVlc3RCZWxsLmZpcmUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMRlxuICAgKiBMaW5lIEZlZWQgb3IgTmV3IExpbmUgKE5MKS4gIChMRiAgaXMgQ3RybC1KKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIExGICAgXCJMaW5lIEZlZWRcIiAgICAgICAgICAgIFwiXFxuLCBcXHgwQVwiICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgcm93IGRvd24sIHNjcm9sbGluZyBpZiBuZWVkZWQuXCJcbiAgICogU2Nyb2xsaW5nIGlzIHJlc3RyaWN0ZWQgdG8gc2Nyb2xsIG1hcmdpbnMgYW5kIHdpbGwgb25seSBoYXBwZW4gb24gdGhlIGJvdHRvbSBsaW5lLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgVlQgICBcIlZlcnRpY2FsIFRhYnVsYXRpb25cIiAgXCJcXHYsIFxceDBCXCIgIFwiVHJlYXRlZCBhcyBMRi5cIlxuICAgKiBAdnQ6ICNZICAgQzAgICAgRkYgICBcIkZvcm0gRmVlZFwiICAgICAgICAgICAgXCJcXGYsIFxceDBDXCIgIFwiVHJlYXRlZCBhcyBMRi5cIlxuICAgKi9cbiAgcHVibGljIGxpbmVGZWVkKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmNvbnZlcnRFb2wpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkrKztcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gKyAxKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGVyZSB3YXMgYW4gZXhwbGljaXQgbGluZSBmZWVkIChub3QganVzdCBhIGNhcnJpYWdlIHJldHVybiksIHNvIGNsZWFyIHRoZSB3cmFwcGVkIHN0YXRlIG9mXG4gICAgICAvLyB0aGUgbGluZS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IG9uIGNvbnB0eS9XaW5kb3dzIHdoZXJlIHJldmlzaXRpbmcgbGluZXMgdG9cbiAgICAgIC8vIHJlcHJpbnQgaXMgY29tbW9uLCBlc3BlY2lhbGx5IG9uIHJlc2l6ZS4gTm90ZSB0aGF0IHRoZSB3aW5kb3dzTW9kZSB3cmFwcGVkIGxpbmUgaGV1cmlzdGljc1xuICAgICAgLy8gY2FuIG1lc3Mgd2l0aCB0aGlzIHNvIHdpbmRvd3NNb2RlIHNob3VsZCBiZSBkaXNhYmxlZCwgd2hpY2ggaXMgcmVjb21tZW5kZWQgb24gV2luZG93cyBidWlsZFxuICAgICAgLy8gMjEzNzYgYW5kIGFib3ZlLlxuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIGhpdCwgcHJldmVudCB0aGlzIGFjdGlvbiBmcm9tIHdyYXBwaW5nIGFyb3VuZCB0byB0aGUgbmV4dCBsaW5lLlxuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LS07XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuXG4gICAgdGhpcy5fb25MaW5lRmVlZC5maXJlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1JcbiAgICogQ2FycmlhZ2UgUmV0dXJuIChDdHJsLU0pLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgQ1IgICBcIkNhcnJpYWdlIFJldHVyblwiICBcIlxcciwgXFx4MERcIiAgXCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcm93LlwiXG4gICAqL1xuICBwdWJsaWMgY2FycmlhZ2VSZXR1cm4oKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEJTXG4gICAqIEJhY2tzcGFjZSAoQ3RybC1IKS5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMwICAgIEJTICAgXCJCYWNrc3BhY2VcIiAgXCJcXGIsIFxceDA4XCIgIFwiTW92ZSB0aGUgY3Vyc29yIG9uZSBwb3NpdGlvbiB0byB0aGUgbGVmdC5cIlxuICAgKiBCeSBkZWZhdWx0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb3ZlIHRoZSBjdXJzb3IgcGFzdCB0aGUgbGVmdG1vc3QgcG9zaXRpb24uXG4gICAqIElmIGByZXZlcnNlIHdyYXAtYXJvdW5kYCAoYENTSSA/IDQ1IGhgKSBpcyBzZXQsIGEgcHJldmlvdXMgc29mdCBsaW5lIHdyYXAgKERFQ0FXTSlcbiAgICogY2FuIGJlIHVuZG9uZSB3aXRoIEJTIHdpdGhpbiB0aGUgc2Nyb2xsIG1hcmdpbnMuIEluIHRoYXQgY2FzZSB0aGUgY3Vyc29yIHdpbGwgd3JhcCBiYWNrXG4gICAqIHRvIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJvdy4gTm90ZSB0aGF0IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwZWVrIGJhY2sgaW50byB0aGUgc2Nyb2xsYnVmZmVyXG4gICAqIHdpdGggdGhlIGN1cnNvciwgdGh1cyBhdCB0aGUgaG9tZSBwb3NpdGlvbiAodG9wLWxlZnRtb3N0IGNlbGwpIHRoaXMgaGFzIG5vIGVmZmVjdC5cbiAgICovXG4gIHB1YmxpYyBiYWNrc3BhY2UoKTogYm9vbGVhbiB7XG4gICAgLy8gcmV2ZXJzZSB3cmFwLWFyb3VuZCBpcyBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLnJldmVyc2VXcmFwYXJvdW5kKSB7XG4gICAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID4gMCkge1xuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueC0tO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gcmV2ZXJzZSB3cmFwLWFyb3VuZCBpcyBlbmFibGVkXG4gICAgLy8gb3RoZXIgdGhhbiBmb3Igbm9ybWFsIG9wZXJhdGlvbiBtb2RlLCByZXZlcnNlIHdyYXAtYXJvdW5kIGFsbG93cyB0aGUgY3Vyc29yXG4gICAgLy8gdG8gYmUgYXQgeD1jb2xzIHRvIGJlIGFibGUgdG8gYWRkcmVzcyB0aGUgbGFzdCBjZWxsIG9mIGEgcm93IGJ5IEJTXG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKTtcblxuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+IDApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LS07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qKlxuICAgICAgICogcmV2ZXJzZSB3cmFwLWFyb3VuZCBoYW5kbGluZzpcbiAgICAgICAqIE91ciBpbXBsZW1lbnRhdGlvbiBkZXZpYXRlcyBmcm9tIHh0ZXJtIG9uIHB1cnBvc2UuIERldGFpbHM6XG4gICAgICAgKiAtIG9ubHkgcHJldmlvdXMgc29mdCBOTHMgY2FuIGJlIHJldmVyc2VkIChpc1dyYXBwZWQ9dHJ1ZSlcbiAgICAgICAqIC0gb25seSB3b3JrcyB3aXRoaW4gc2Nyb2xsYm9yZGVycyAodG9wL2JvdHRvbSwgbGVmdC9yaWdodCBub3QgeWV0IHN1cHBvcnRlZClcbiAgICAgICAqIC0gY2Fubm90IHBlZWsgaW50byBzY3JvbGxidWZmZXJcbiAgICAgICAqIC0gYW55IGN1cnNvciBtb3ZlbWVudCBzZXF1ZW5jZSBrZWVwcyB3b3JraW5nIGFzIGV4cGVjdGVkXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA9PT0gMFxuICAgICAgICAmJiB0aGlzLl9hY3RpdmVCdWZmZXIueSA+IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3BcbiAgICAgICAgJiYgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPD0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbVxuICAgICAgICAmJiB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KT8uaXNXcmFwcGVkKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpIS5pc1dyYXBwZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnktLTtcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxO1xuICAgICAgICAvLyBmaW5kIGxhc3QgdGFrZW4gY2VsbCAtIGxhc3QgY2VsbCBjYW4gaGF2ZSAzIGRpZmZlcmVudCBzdGF0ZXM6XG4gICAgICAgIC8vIC0gaGFzQ29udGVudCh0cnVlKSArIGhhc1dpZHRoKDEpOiBuYXJyb3cgY2hhciAtIHdlIGFyZSBkb25lXG4gICAgICAgIC8vIC0gaGFzV2lkdGgoMCk6IHNlY29uZCBwYXJ0IG9mIHdpZGUgY2hhciAtIHdlIGFyZSBkb25lXG4gICAgICAgIC8vIC0gaGFzQ29udGVudChmYWxzZSkgKyBoYXNXaWR0aCgxKTogZW1wdHkgY2VsbCBkdWUgdG8gZWFybHkgd3JhcHBpbmcgd2lkZSBjaGFyLCBnbyBvbmVcbiAgICAgICAgLy8gICBjZWxsIGZ1cnRoZXIgYmFja1xuICAgICAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSkhO1xuICAgICAgICBpZiAobGluZS5oYXNXaWR0aCh0aGlzLl9hY3RpdmVCdWZmZXIueCkgJiYgIWxpbmUuaGFzQ29udGVudCh0aGlzLl9hY3RpdmVCdWZmZXIueCkpIHtcbiAgICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueC0tO1xuICAgICAgICAgIC8vIFdlIGRvIHRoaXMgb25seSBvbmNlLCBzaW5jZSB3aWR0aD0xICsgaGFzQ29udGVudD1mYWxzZSBjdXJyZW50bHkgaGFwcGVucyBvbmx5IG9uY2VcbiAgICAgICAgICAvLyBiZWZvcmUgZWFybHkgd3JhcHBpbmcgb2YgYSB3aWRlIGNoYXIuXG4gICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBvbmNlIHdlIHN1cHBvcnQgZ3JhcGhlbWVzIHRha2luZyBtb3JlIHRoYW4gMiBjZWxscy5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRBQlxuICAgKiBIb3Jpem9udGFsIFRhYiAoSFQpIChDdHJsLUkpLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzAgICAgSFQgICBcIkhvcml6b250YWwgVGFidWxhdGlvblwiICBcIlxcdCwgXFx4MDlcIiAgXCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRhYiBzdG9wLlwiXG4gICAqL1xuICBwdWJsaWMgdGFiKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5hbFggPSB0aGlzLl9hY3RpdmVCdWZmZXIueDtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5uZXh0U3RvcCgpO1xuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcmVlblJlYWRlck1vZGUpIHtcbiAgICAgIHRoaXMuX29uQTExeVRhYi5maXJlKHRoaXMuX2FjdGl2ZUJ1ZmZlci54IC0gb3JpZ2luYWxYKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU09cbiAgICogU2hpZnQgT3V0IChDdHJsLU4pIC0+IFN3aXRjaCB0byBBbHRlcm5hdGUgQ2hhcmFjdGVyIFNldC4gIFRoaXMgaW52b2tlcyB0aGVcbiAgICogRzEgY2hhcmFjdGVyIHNldC5cbiAgICpcbiAgICogQHZ0OiAjUFtPbmx5IGxpbWl0ZWQgSVNPLTIwMjIgY2hhcnNldCBzdXBwb3J0Ll0gIEMwICAgIFNPICAgXCJTaGlmdCBPdXRcIiAgXCJcXHgwRVwiICBcIlN3aXRjaCB0byBhbiBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXIgc2V0LlwiXG4gICAqL1xuICBwdWJsaWMgc2hpZnRPdXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNJXG4gICAqIFNoaWZ0IEluIChDdHJsLU8pIC0+IFN3aXRjaCB0byBTdGFuZGFyZCBDaGFyYWN0ZXIgU2V0LiAgVGhpcyBpbnZva2VzIHRoZSBHMFxuICAgKiBjaGFyYWN0ZXIgc2V0ICh0aGUgZGVmYXVsdCkuXG4gICAqXG4gICAqIEB2dDogI1kgICBDMCAgICBTSSAgIFwiU2hpZnQgSW5cIiAgIFwiXFx4MEZcIiAgXCJSZXR1cm4gdG8gcmVndWxhciBjaGFyYWN0ZXIgc2V0IGFmdGVyIFNoaWZ0IE91dC5cIlxuICAgKi9cbiAgcHVibGljIHNoaWZ0SW4oKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RyaWN0IGN1cnNvciB0byB2aWV3cG9ydCBzaXplIC8gc2Nyb2xsIG1hcmdpbiAob3JpZ2luIG1vZGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzdHJpY3RDdXJzb3IobWF4Q29sOiBudW1iZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMgLSAxKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSBNYXRoLm1pbihtYXhDb2wsIE1hdGgubWF4KDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54KSk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luXG4gICAgICA/IE1hdGgubWluKHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20sIE1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci55KSlcbiAgICAgIDogTWF0aC5taW4odGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMSwgTWF0aC5tYXgoMCwgdGhpcy5fYWN0aXZlQnVmZmVyLnkpKTtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYWJzb2x1dGUgY3Vyc29yIHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0Q3Vyc29yKHg6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgaWYgKHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW4pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0geDtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCArIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0geDtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0geTtcbiAgICB9XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmVsYXRpdmUgY3Vyc29yIHBvc2l0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfbW92ZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIGZvciByZWxhdGl2ZSBjaGFuZ2VzIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHdlIGFyZSB3aXRoaW4gMCAuLiBjb2xzL3Jvd3MgLSAxXG4gICAgLy8gYmVmb3JlIGNhbGN1bGF0aW5nIHRoZSBuZXcgcG9zaXRpb25cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHRoaXMuX3NldEN1cnNvcih0aGlzLl9hY3RpdmVCdWZmZXIueCArIHgsIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgeSk7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIEFcbiAgICogQ3Vyc29yIFVwIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENVVSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENVVSAgIFwiQ3Vyc29yIFVwXCIgICBcIkNTSSBQcyBBXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyB1cCAoZGVmYXVsdD0xKS5cIlxuICAgKiBJZiB0aGUgY3Vyc29yIHdvdWxkIHBhc3MgdGhlIHRvcCBzY3JvbGwgbWFyZ2luLCBpdCB3aWxsIHN0b3AgdGhlcmUuXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yVXAocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgLy8gc3RvcCBhdCBzY3JvbGxUb3BcbiAgICBjb25zdCBkaWZmVG9Ub3AgPSB0aGlzLl9hY3RpdmVCdWZmZXIueSAtIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3A7XG4gICAgaWYgKGRpZmZUb1RvcCA+PSAwKSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIC1NYXRoLm1pbihkaWZmVG9Ub3AsIHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIC0ocGFyYW1zLnBhcmFtc1swXSB8fCAxKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBCXG4gICAqIEN1cnNvciBEb3duIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENVRCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENVRCAgIFwiQ3Vyc29yIERvd25cIiAgIFwiQ1NJIFBzIEJcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGRvd24gKGRlZmF1bHQ9MSkuXCJcbiAgICogSWYgdGhlIGN1cnNvciB3b3VsZCBwYXNzIHRoZSBib3R0b20gc2Nyb2xsIG1hcmdpbiwgaXQgd2lsbCBzdG9wIHRoZXJlLlxuICAgKi9cbiAgcHVibGljIGN1cnNvckRvd24ocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgLy8gc3RvcCBhdCBzY3JvbGxCb3R0b21cbiAgICBjb25zdCBkaWZmVG9Cb3R0b20gPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIC0gdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG4gICAgaWYgKGRpZmZUb0JvdHRvbSA+PSAwKSB7XG4gICAgICB0aGlzLl9tb3ZlQ3Vyc29yKDAsIE1hdGgubWluKGRpZmZUb0JvdHRvbSwgcGFyYW1zLnBhcmFtc1swXSB8fCAxKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21vdmVDdXJzb3IoMCwgcGFyYW1zLnBhcmFtc1swXSB8fCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIENcbiAgICogQ3Vyc29yIEZvcndhcmQgUHMgVGltZXMgKGRlZmF1bHQgPSAxKSAoQ1VGKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgQ1VGICAgXCJDdXJzb3IgRm9yd2FyZFwiICAgIFwiQ1NJIFBzIENcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGZvcndhcmQgKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBjdXJzb3JGb3J3YXJkKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX21vdmVDdXJzb3IocGFyYW1zLnBhcmFtc1swXSB8fCAxLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgRFxuICAgKiBDdXJzb3IgQmFja3dhcmQgUHMgVGltZXMgKGRlZmF1bHQgPSAxKSAoQ1VCKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgQ1VCICAgXCJDdXJzb3IgQmFja3dhcmRcIiAgIFwiQ1NJIFBzIERcIiAgXCJNb3ZlIGN1cnNvciBgUHNgIHRpbWVzIGJhY2t3YXJkIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yQmFja3dhcmQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fbW92ZUN1cnNvcigtKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSksIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBFXG4gICAqIEN1cnNvciBOZXh0IExpbmUgUHMgVGltZXMgKGRlZmF1bHQgPSAxKSAoQ05MKS5cbiAgICogT3RoZXIgdGhhbiBjdXJzb3JEb3duIChDVUQpIGFsc28gc2V0IHRoZSBjdXJzb3IgdG8gZmlyc3QgY29sdW1uLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDTkwgICBcIkN1cnNvciBOZXh0IExpbmVcIiAgXCJDU0kgUHMgRVwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgZG93biAoZGVmYXVsdD0xKSBhbmQgdG8gdGhlIGZpcnN0IGNvbHVtbi5cIlxuICAgKiBTYW1lIGFzIENVRCwgYWRkaXRpb25hbGx5IHBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBmaXJzdCBjb2x1bW4uXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yTmV4dExpbmUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5jdXJzb3JEb3duKHBhcmFtcyk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBGXG4gICAqIEN1cnNvciBQcmV2aW91cyBMaW5lIFBzIFRpbWVzIChkZWZhdWx0ID0gMSkgKENQTCkuXG4gICAqIE90aGVyIHRoYW4gY3Vyc29yVXAgKENVVSkgYWxzbyBzZXQgdGhlIGN1cnNvciB0byBmaXJzdCBjb2x1bW4uXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENQTCAgIFwiQ3Vyc29yIEJhY2t3YXJkXCIgICBcIkNTSSBQcyBGXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyB1cCAoZGVmYXVsdD0xKSBhbmQgdG8gdGhlIGZpcnN0IGNvbHVtbi5cIlxuICAgKiBTYW1lIGFzIENVVSwgYWRkaXRpb25hbGx5IHBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBmaXJzdCBjb2x1bW4uXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yUHJlY2VkaW5nTGluZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLmN1cnNvclVwKHBhcmFtcyk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBHXG4gICAqIEN1cnNvciBDaGFyYWN0ZXIgQWJzb2x1dGUgIFtjb2x1bW5dIChkZWZhdWx0ID0gW3JvdywxXSkgKENIQSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENIQSAgIFwiQ3Vyc29yIEhvcml6b250YWwgQWJzb2x1dGVcIiBcIkNTSSBQcyBHXCIgXCJNb3ZlIGN1cnNvciB0byBgUHNgLXRoIGNvbHVtbiBvZiB0aGUgYWN0aXZlIHJvdyAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIGN1cnNvckNoYXJBYnNvbHV0ZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9zZXRDdXJzb3IoKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkgLSAxLCB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIDsgUHMgSFxuICAgKiBDdXJzb3IgUG9zaXRpb24gW3Jvdztjb2x1bW5dIChkZWZhdWx0ID0gWzEsMV0pIChDVVApLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBDVVAgICBcIkN1cnNvciBQb3NpdGlvblwiICAgXCJDU0kgUHMgOyBQcyBIXCIgIFwiU2V0IGN1cnNvciB0byBwb3NpdGlvbiBbYFBzYCwgYFBzYF0gKGRlZmF1bHQgPSBbMSwgMV0pLlwiXG4gICAqIElmIE9SSUdJTiBtb2RlIGlzIHNldCwgcGxhY2VzIHRoZSBjdXJzb3IgdG8gdGhlIGFic29sdXRlIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqIElmIE9SSUdJTiBtb2RlIGlzIG5vdCBzZXQsIHBsYWNlcyB0aGUgY3Vyc29yIHRvIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHZpZXdwb3J0LlxuICAgKiBOb3RlIHRoYXQgdGhlIGNvb3JkaW5hdGVzIGFyZSAxLWJhc2VkLCB0aHVzIHRoZSB0b3AgbGVmdCBwb3NpdGlvbiBzdGFydHMgYXQgYDEgOyAxYC5cbiAgICovXG4gIHB1YmxpYyBjdXJzb3JQb3NpdGlvbihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9zZXRDdXJzb3IoXG4gICAgICAvLyBjb2xcbiAgICAgIChwYXJhbXMubGVuZ3RoID49IDIpID8gKHBhcmFtcy5wYXJhbXNbMV0gfHwgMSkgLSAxIDogMCxcbiAgICAgIC8vIHJvd1xuICAgICAgKHBhcmFtcy5wYXJhbXNbMF0gfHwgMSkgLSAxXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gYCAgQ2hhcmFjdGVyIFBvc2l0aW9uIEFic29sdXRlXG4gICAqICAgW2NvbHVtbl0gKGRlZmF1bHQgPSBbcm93LDFdKSAoSFBBKS5cbiAgICogQ3VycmVudGx5IHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBDSEEuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIEhQQSAgIFwiSG9yaXpvbnRhbCBQb3NpdGlvbiBBYnNvbHV0ZVwiICBcIkNTSSBQcyBgIFwiIFwiU2FtZSBhcyBDSEEuXCJcbiAgICovXG4gIHB1YmxpYyBjaGFyUG9zQWJzb2x1dGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKChwYXJhbXMucGFyYW1zWzBdIHx8IDEpIC0gMSwgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQbSBhICBDaGFyYWN0ZXIgUG9zaXRpb24gUmVsYXRpdmVcbiAgICogICBbY29sdW1uc10gKGRlZmF1bHQgPSBbcm93LGNvbCsxXSkgKEhQUilcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgSFBSICAgXCJIb3Jpem9udGFsIFBvc2l0aW9uIFJlbGF0aXZlXCIgIFwiQ1NJIFBzIGFcIiAgXCJTYW1lIGFzIENVRi5cIlxuICAgKi9cbiAgcHVibGljIGhQb3NpdGlvblJlbGF0aXZlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX21vdmVDdXJzb3IocGFyYW1zLnBhcmFtc1swXSB8fCAxLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gZCAgVmVydGljYWwgUG9zaXRpb24gQWJzb2x1dGUgKFZQQSlcbiAgICogICBbcm93XSAoZGVmYXVsdCA9IFsxLGNvbHVtbl0pXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFZQQSAgIFwiVmVydGljYWwgUG9zaXRpb24gQWJzb2x1dGVcIiAgICBcIkNTSSBQcyBkXCIgIFwiTW92ZSBjdXJzb3IgdG8gYFBzYC10aCByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICovXG4gIHB1YmxpYyBsaW5lUG9zQWJzb2x1dGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fc2V0Q3Vyc29yKHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCAocGFyYW1zLnBhcmFtc1swXSB8fCAxKSAtIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQbSBlICBWZXJ0aWNhbCBQb3NpdGlvbiBSZWxhdGl2ZSAoVlBSKVxuICAgKiAgIFtyb3dzXSAoZGVmYXVsdCA9IFtyb3crMSxjb2x1bW5dKVxuICAgKiByZXVzZSBDU0kgUHMgQiA/XG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFZQUiAgIFwiVmVydGljYWwgUG9zaXRpb24gUmVsYXRpdmVcIiAgICBcIkNTSSBQcyBlXCIgIFwiTW92ZSBjdXJzb3IgYFBzYCB0aW1lcyBkb3duIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgdlBvc2l0aW9uUmVsYXRpdmUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fbW92ZUN1cnNvcigwLCBwYXJhbXMucGFyYW1zWzBdIHx8IDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIGZcbiAgICogICBIb3Jpem9udGFsIGFuZCBWZXJ0aWNhbCBQb3NpdGlvbiBbcm93O2NvbHVtbl0gKGRlZmF1bHQgPVxuICAgKiAgIFsxLDFdKSAoSFZQKS5cbiAgICogICBTYW1lIGFzIENVUC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgSFZQICAgXCJIb3Jpem9udGFsIGFuZCBWZXJ0aWNhbCBQb3NpdGlvblwiIFwiQ1NJIFBzIDsgUHMgZlwiICBcIlNhbWUgYXMgQ1VQLlwiXG4gICAqL1xuICBwdWJsaWMgaFZQb3NpdGlvbihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uKHBhcmFtcyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIGcgIFRhYiBDbGVhciAoVEJDKS5cbiAgICogICAgIFBzID0gMCAgLT4gQ2xlYXIgQ3VycmVudCBDb2x1bW4gKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAzICAtPiBDbGVhciBBbGwuXG4gICAqIFBvdGVudGlhbGx5OlxuICAgKiAgIFBzID0gMiAgLT4gQ2xlYXIgU3RvcHMgb24gTGluZS5cbiAgICogICBodHRwOi8vdnQxMDAubmV0L2FubmFyYm9yL2FhYS11Zy9zZWN0aW9uNi5odG1sXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFRCQyAgIFwiVGFiIENsZWFyXCIgXCJDU0kgUHMgZ1wiICBcIkNsZWFyIHRhYiBzdG9wcyBhdCBjdXJyZW50IHBvc2l0aW9uICgwKSBvciBhbGwgKDMpIChkZWZhdWx0PTApLlwiXG4gICAqIENsZWFyaW5nIHRhYnN0b3BzIG9mZiB0aGUgYWN0aXZlIHJvdyAoUHMgPSAyLCBWVDEwMCkgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgdGFiQ2xlYXIocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdO1xuICAgIGlmIChwYXJhbSA9PT0gMCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZUJ1ZmZlci50YWJzW3RoaXMuX2FjdGl2ZUJ1ZmZlci54XTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtID09PSAzKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIudGFicyA9IHt9O1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgSVxuICAgKiAgIEN1cnNvciBGb3J3YXJkIFRhYnVsYXRpb24gUHMgdGFiIHN0b3BzIChkZWZhdWx0ID0gMSkgKENIVCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENIVCAgIFwiQ3Vyc29yIEhvcml6b250YWwgVGFidWxhdGlvblwiIFwiQ1NJIFBzIElcIiBcIk1vdmUgY3Vyc29yIGBQc2AgdGltZXMgdGFicyBmb3J3YXJkIChkZWZhdWx0PTEpLlwiXG4gICAqL1xuICBwdWJsaWMgY3Vyc29yRm9yd2FyZFRhYihwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnggPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5uZXh0U3RvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgWiAgQ3Vyc29yIEJhY2t3YXJkIFRhYnVsYXRpb24gUHMgdGFiIHN0b3BzIChkZWZhdWx0ID0gMSkgKENCVCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIENCVCAgIFwiQ3Vyc29yIEJhY2t3YXJkIFRhYnVsYXRpb25cIiAgXCJDU0kgUHMgWlwiICBcIk1vdmUgY3Vyc29yIGBQc2AgdGFicyBiYWNrd2FyZCAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIGN1cnNvckJhY2t3YXJkVGFiKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSB0aGlzLl9hY3RpdmVCdWZmZXIucHJldlN0b3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFwiIHEgIFNlbGVjdCBDaGFyYWN0ZXIgUHJvdGVjdGlvbiBBdHRyaWJ1dGUgKERFQ1NDQSkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ1NDQSAgIFwiU2VsZWN0IENoYXJhY3RlciBQcm90ZWN0aW9uIEF0dHJpYnV0ZVwiICBcIkNTSSBQcyBcIiBxXCIgIFwiV2hldGhlciBERUNTRUQgYW5kIERFQ1NFTCBjYW4gZXJhc2UgKDA9ZGVmYXVsdCwgMikgb3Igbm90ICgxKS5cIlxuICAgKi9cbiAgcHVibGljIHNlbGVjdFByb3RlY3RlZChwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBwID0gcGFyYW1zLnBhcmFtc1swXTtcbiAgICBpZiAocCA9PT0gMSkgdGhpcy5fY3VyQXR0ckRhdGEuYmcgfD0gQmdGbGFncy5QUk9URUNURUQ7XG4gICAgaWYgKHAgPT09IDIgfHwgcCA9PT0gMCkgdGhpcy5fY3VyQXR0ckRhdGEuYmcgJj0gfkJnRmxhZ3MuUFJPVEVDVEVEO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBlcmFzZSBjZWxscyBpbiBhIHRlcm1pbmFsIHJvdy5cbiAgICogVGhlIGNlbGwgZ2V0cyByZXBsYWNlZCB3aXRoIHRoZSBlcmFzZUNoYXIgb2YgdGhlIHRlcm1pbmFsLlxuICAgKiBAcGFyYW0geSBUaGUgcm93IGluZGV4IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC5cbiAgICogQHBhcmFtIHN0YXJ0IFRoZSBzdGFydCB4IGluZGV4IG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQuXG4gICAqIEBwYXJhbSBlbmQgVGhlIGVuZCB4IGluZGV4IG9mIHRoZSByYW5nZSB0byBiZSBlcmFzZWQgKGV4Y2x1c2l2ZSkuXG4gICAqIEBwYXJhbSBjbGVhcldyYXAgY2xlYXIgdGhlIGlzV3JhcHBlZCBmbGFnXG4gICAqIEBwYXJhbSByZXNwZWN0UHJvdGVjdCBXaGV0aGVyIHRvIHJlc3BlY3QgdGhlIHByb3RlY3Rpb24gYXR0cmlidXRlIChERUNTQ0EpLlxuICAgKi9cbiAgcHJpdmF0ZSBfZXJhc2VJbkJ1ZmZlckxpbmUoeTogbnVtYmVyLCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgY2xlYXJXcmFwOiBib29sZWFuID0gZmFsc2UsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KSE7XG4gICAgbGluZS5yZXBsYWNlQ2VsbHMoXG4gICAgICBzdGFydCxcbiAgICAgIGVuZCxcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpLFxuICAgICAgcmVzcGVjdFByb3RlY3RcbiAgICApO1xuICAgIGlmIChjbGVhcldyYXApIHtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gcmVzZXQgY2VsbHMgaW4gYSB0ZXJtaW5hbCByb3cuIFRoZSBjZWxsIGdldHMgcmVwbGFjZWQgd2l0aCB0aGUgZXJhc2VDaGFyIG9mXG4gICAqIHRoZSB0ZXJtaW5hbCBhbmQgdGhlIGlzV3JhcHBlZCBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UuXG4gICAqIEBwYXJhbSB5IHJvdyBpbmRleFxuICAgKi9cbiAgcHJpdmF0ZSBfcmVzZXRCdWZmZXJMaW5lKHk6IG51bWJlciwgcmVzcGVjdFByb3RlY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICBsaW5lLmZpbGwodGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSksIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLmNsZWFyTWFya2Vycyh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB5KTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBKICBFcmFzZSBpbiBEaXNwbGF5IChFRCkuXG4gICAqICAgICBQcyA9IDAgIC0+IEVyYXNlIEJlbG93IChkZWZhdWx0KS5cbiAgICogICAgIFBzID0gMSAgLT4gRXJhc2UgQWJvdmUuXG4gICAqICAgICBQcyA9IDIgIC0+IEVyYXNlIEFsbC5cbiAgICogICAgIFBzID0gMyAgLT4gRXJhc2UgU2F2ZWQgTGluZXMgKHh0ZXJtKS5cbiAgICogQ1NJID8gUHMgSlxuICAgKiAgIEVyYXNlIGluIERpc3BsYXkgKERFQ1NFRCkuXG4gICAqICAgICBQcyA9IDAgIC0+IFNlbGVjdGl2ZSBFcmFzZSBCZWxvdyAoZGVmYXVsdCkuXG4gICAqICAgICBQcyA9IDEgIC0+IFNlbGVjdGl2ZSBFcmFzZSBBYm92ZS5cbiAgICogICAgIFBzID0gMiAgLT4gU2VsZWN0aXZlIEVyYXNlIEFsbC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgRUQgIFwiRXJhc2UgSW4gRGlzcGxheVwiICBcIkNTSSBQcyBKXCIgIFwiRXJhc2UgdmFyaW91cyBwYXJ0cyBvZiB0aGUgdmlld3BvcnQuXCJcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlczpcbiAgICpcbiAgICogfCBQcyB8IEVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfFxuICAgKiB8IDAgIHwgRXJhc2UgZnJvbSB0aGUgY3Vyc29yIHRocm91Z2ggdGhlIGVuZCBvZiB0aGUgdmlld3BvcnQuICAgICAgIHxcbiAgICogfCAxICB8IEVyYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdmlld3BvcnQgdGhyb3VnaCB0aGUgY3Vyc29yLiB8XG4gICAqIHwgMiAgfCBFcmFzZSBjb21wbGV0ZSB2aWV3cG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IDMgIHwgRXJhc2Ugc2Nyb2xsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDU0VEICAgXCJTZWxlY3RpdmUgRXJhc2UgSW4gRGlzcGxheVwiICBcIkNTSSA/IFBzIEpcIiAgXCJTYW1lIGFzIEVEIHdpdGggcmVzcGVjdGluZyBwcm90ZWN0aW9uIGZsYWcuXCJcbiAgICovXG4gIHB1YmxpYyBlcmFzZUluRGlzcGxheShwYXJhbXM6IElQYXJhbXMsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcih0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMpO1xuICAgIGxldCBqO1xuICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1swXSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICBqID0gdGhpcy5fYWN0aXZlQnVmZmVyLnk7XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoaik7XG4gICAgICAgIHRoaXMuX2VyYXNlSW5CdWZmZXJMaW5lKGorKywgdGhpcy5fYWN0aXZlQnVmZmVyLngsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdGhpcy5fYWN0aXZlQnVmZmVyLnggPT09IDAsIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgZm9yICg7IGogPCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3M7IGorKykge1xuICAgICAgICAgIHRoaXMuX3Jlc2V0QnVmZmVyTGluZShqLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShqKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGogPSB0aGlzLl9hY3RpdmVCdWZmZXIueTtcbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShqKTtcbiAgICAgICAgLy8gRGVsZXRlZCBmcm9udCBwYXJ0IG9mIGxpbmUgYW5kIGV2ZXJ5dGhpbmcgYmVmb3JlLiBUaGlzIGxpbmUgd2lsbCBubyBsb25nZXIgYmUgd3JhcHBlZC5cbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUoaiwgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyAxLCB0cnVlLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIueCArIDEgPj0gdGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKSB7XG4gICAgICAgICAgLy8gRGVsZXRlZCBlbnRpcmUgcHJldmlvdXMgbGluZS4gVGhpcyBuZXh0IGxpbmUgY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkLlxuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQoaiArIDEpIS5pc1dyYXBwZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgICAgdGhpcy5fcmVzZXRCdWZmZXJMaW5lKGosIHJlc3BlY3RQcm90ZWN0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaiA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cztcbiAgICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eShqIC0gMSk7XG4gICAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgICB0aGlzLl9yZXNldEJ1ZmZlckxpbmUoaiwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkoMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICAvLyBDbGVhciBzY3JvbGxiYWNrIChldmVyeXRoaW5nIG5vdCBpbiB2aWV3cG9ydClcbiAgICAgICAgY29uc3Qgc2Nyb2xsQmFja1NpemUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMubGVuZ3RoIC0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgICAgICBpZiAoc2Nyb2xsQmFja1NpemUgPiAwKSB7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnRyaW1TdGFydChzY3JvbGxCYWNrU2l6ZSk7XG4gICAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlID0gTWF0aC5tYXgodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlIC0gc2Nyb2xsQmFja1NpemUsIDApO1xuICAgICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ZGlzcCA9IE1hdGgubWF4KHRoaXMuX2FjdGl2ZUJ1ZmZlci55ZGlzcCAtIHNjcm9sbEJhY2tTaXplLCAwKTtcbiAgICAgICAgICAvLyBGb3JjZSBhIHNjcm9sbCBldmVudCB0byByZWZyZXNoIHZpZXdwb3J0XG4gICAgICAgICAgdGhpcy5fb25TY3JvbGwuZmlyZSgwKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIEsgIEVyYXNlIGluIExpbmUgKEVMKS5cbiAgICogICAgIFBzID0gMCAgLT4gRXJhc2UgdG8gUmlnaHQgKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBFcmFzZSB0byBMZWZ0LlxuICAgKiAgICAgUHMgPSAyICAtPiBFcmFzZSBBbGwuXG4gICAqIENTSSA/IFBzIEtcbiAgICogICBFcmFzZSBpbiBMaW5lIChERUNTRUwpLlxuICAgKiAgICAgUHMgPSAwICAtPiBTZWxlY3RpdmUgRXJhc2UgdG8gUmlnaHQgKGRlZmF1bHQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBTZWxlY3RpdmUgRXJhc2UgdG8gTGVmdC5cbiAgICogICAgIFBzID0gMiAgLT4gU2VsZWN0aXZlIEVyYXNlIEFsbC5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgRUwgICAgXCJFcmFzZSBJbiBMaW5lXCIgIFwiQ1NJIFBzIEtcIiAgXCJFcmFzZSB2YXJpb3VzIHBhcnRzIG9mIHRoZSBhY3RpdmUgcm93LlwiXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXM6XG4gICAqXG4gICAqIHwgUHMgfCBFZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqIHwgMCAgfCBFcmFzZSBmcm9tIHRoZSBjdXJzb3IgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSByb3cuICAgICAgICB8XG4gICAqIHwgMSAgfCBFcmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgdGhyb3VnaCB0aGUgY3Vyc29yLiB8XG4gICAqIHwgMiAgfCBFcmFzZSBjb21wbGV0ZSBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ1NFTCAgIFwiU2VsZWN0aXZlIEVyYXNlIEluIExpbmVcIiAgXCJDU0kgPyBQcyBLXCIgIFwiU2FtZSBhcyBFTCB3aXRoIHJlc3BlY3RpbmcgcHJvdGVjdGluZyBmbGFnLlwiXG4gICAqL1xuICBwdWJsaWMgZXJhc2VJbkxpbmUocGFyYW1zOiBJUGFyYW1zLCByZXNwZWN0UHJvdGVjdDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzKTtcbiAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbMF0pIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LCB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID09PSAwLCByZXNwZWN0UHJvdGVjdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB0aGlzLl9lcmFzZUluQnVmZmVyTGluZSh0aGlzLl9hY3RpdmVCdWZmZXIueSwgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyAxLCBmYWxzZSwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy5fZXJhc2VJbkJ1ZmZlckxpbmUodGhpcy5fYWN0aXZlQnVmZmVyLnksIDAsIHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scywgdHJ1ZSwgcmVzcGVjdFByb3RlY3QpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIExcbiAgICogSW5zZXJ0IFBzIExpbmUocykgKGRlZmF1bHQgPSAxKSAoSUwpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBJTCAgXCJJbnNlcnQgTGluZVwiICAgXCJDU0kgUHMgTFwiICBcIkluc2VydCBgUHNgIGJsYW5rIGxpbmVzIGF0IGFjdGl2ZSByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICogRm9yIGV2ZXJ5IGluc2VydGVkIGxpbmUgYXQgdGhlIHNjcm9sbCB0b3Agb25lIGxpbmUgYXQgdGhlIHNjcm9sbCBib3R0b20gZ2V0cyByZW1vdmVkLlxuICAgKiBUaGUgY3Vyc29yIGlzIHNldCB0byB0aGUgZmlyc3QgY29sdW1uLlxuICAgKiBJTCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBjdXJzb3IgaXMgb3V0c2lkZSB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgaW5zZXJ0TGluZXMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIHx8IHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93OiBudW1iZXIgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueTtcblxuICAgIGNvbnN0IHNjcm9sbEJvdHRvbVJvd3NPZmZzZXQgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxIC0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbTtcbiAgICBjb25zdCBzY3JvbGxCb3R0b21BYnNvbHV0ZSA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEgKyB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgLSBzY3JvbGxCb3R0b21Sb3dzT2Zmc2V0ICsgMTtcbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgLy8gdGVzdDogZWNobyAtZSAnXFxlWzQ0bVxcZVsxTFxcZVswbSdcbiAgICAgIC8vIGJsYW5rTGluZSh0cnVlKSAtIHh0ZXJtL2xpbnV4IGJlaGF2aW9yXG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHNjcm9sbEJvdHRvbUFic29sdXRlIC0gMSwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHJvdywgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldEJsYW5rTGluZSh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnksIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gMDsgLy8gc2VlIGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vY2hhcHRlcjQuaHRtbCAtIHZ0MjIwIG9ubHk/XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIE1cbiAgICogRGVsZXRlIFBzIExpbmUocykgKGRlZmF1bHQgPSAxKSAoREwpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBETCAgXCJEZWxldGUgTGluZVwiICAgXCJDU0kgUHMgTVwiICBcIkRlbGV0ZSBgUHNgIGxpbmVzIGF0IGFjdGl2ZSByb3cgKGRlZmF1bHQ9MSkuXCJcbiAgICogRm9yIGV2ZXJ5IGRlbGV0ZWQgbGluZSBhdCB0aGUgc2Nyb2xsIHRvcCBvbmUgYmxhbmsgbGluZSBhdCB0aGUgc2Nyb2xsIGJvdHRvbSBnZXRzIGFwcGVuZGVkLlxuICAgKiBUaGUgY3Vyc29yIGlzIHNldCB0byB0aGUgZmlyc3QgY29sdW1uLlxuICAgKiBETCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBjdXJzb3IgaXMgb3V0c2lkZSB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlTGluZXMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIHx8IHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93OiBudW1iZXIgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueTtcblxuICAgIGxldCBqOiBudW1iZXI7XG4gICAgaiA9IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEgLSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tO1xuICAgIGogPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxICsgdGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlIC0gajtcbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgLy8gdGVzdDogZWNobyAtZSAnXFxlWzQ0bVxcZVsxTVxcZVswbSdcbiAgICAgIC8vIGJsYW5rTGluZSh0cnVlKSAtIHh0ZXJtL2xpbnV4IGJlaGF2aW9yXG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHJvdywgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKGosIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCA9IDA7IC8vIHNlZSBodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL2NoYXB0ZXI0Lmh0bWwgLSB2dDIyMCBvbmx5P1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBAXG4gICAqIEluc2VydCBQcyAoQmxhbmspIENoYXJhY3RlcihzKSAoZGVmYXVsdCA9IDEpIChJQ0gpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBJQ0ggIFwiSW5zZXJ0IENoYXJhY3RlcnNcIiAgIFwiQ1NJIFBzIEBcIiAgXCJJbnNlcnQgYFBzYCAoYmxhbmspIGNoYXJhY3RlcnMgKGRlZmF1bHQgPSAxKS5cIlxuICAgKiBUaGUgSUNIIHNlcXVlbmNlIGluc2VydHMgYFBzYCBibGFuayBjaGFyYWN0ZXJzLiBUaGUgY3Vyc29yIHJlbWFpbnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGVcbiAgICogYmxhbmsgY2hhcmFjdGVycy4gVGV4dCBiZXR3ZWVuIHRoZSBjdXJzb3IgYW5kIHJpZ2h0IG1hcmdpbiBtb3ZlcyB0byB0aGUgcmlnaHQuIENoYXJhY3RlcnMgbW92ZWRcbiAgICogcGFzdCB0aGUgcmlnaHQgbWFyZ2luIGFyZSBsb3N0LlxuICAgKlxuICAgKlxuICAgKiBGSVhNRTogY2hlY2sgYWdhaW5zdCB4dGVybSAtIHNob3VsZCBub3Qgd29yayBvdXRzaWRlIG9mIHNjcm9sbCBtYXJnaW5zIChzZWUgVlQ1MjAgbWFudWFsKVxuICAgKi9cbiAgcHVibGljIGluc2VydENoYXJzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIGlmIChsaW5lKSB7XG4gICAgICBsaW5lLmluc2VydENlbGxzKFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCxcbiAgICAgICAgcGFyYW1zLnBhcmFtc1swXSB8fCAxLFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKVxuICAgICAgKTtcbiAgICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgUFxuICAgKiBEZWxldGUgUHMgQ2hhcmFjdGVyKHMpIChkZWZhdWx0ID0gMSkgKERDSCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERDSCAgIFwiRGVsZXRlIENoYXJhY3RlclwiICBcIkNTSSBQcyBQXCIgIFwiRGVsZXRlIGBQc2AgY2hhcmFjdGVycyAoZGVmYXVsdD0xKS5cIlxuICAgKiBBcyBjaGFyYWN0ZXJzIGFyZSBkZWxldGVkLCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgY3Vyc29yIGFuZCByaWdodCBtYXJnaW4gbW92ZSB0b1xuICAgKiB0aGUgbGVmdC4gQ2hhcmFjdGVyIGF0dHJpYnV0ZXMgbW92ZSB3aXRoIHRoZSBjaGFyYWN0ZXJzLiBUaGUgdGVybWluYWwgYWRkcyBibGFuayBjaGFyYWN0ZXJzIGF0XG4gICAqIHRoZSByaWdodCBtYXJnaW4uXG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiBjaGVjayBhZ2FpbnN0IHh0ZXJtIC0gc2hvdWxkIG5vdCB3b3JrIG91dHNpZGUgb2Ygc2Nyb2xsIG1hcmdpbnMgKHNlZSBWVDUyMCBtYW51YWwpXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQ2hhcnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIGxpbmUuZGVsZXRlQ2VsbHMoXG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54LFxuICAgICAgICBwYXJhbXMucGFyYW1zWzBdIHx8IDEsXG4gICAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpXG4gICAgICApO1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBTICBTY3JvbGwgdXAgUHMgbGluZXMgKGRlZmF1bHQgPSAxKSAoU1UpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBTVSAgXCJTY3JvbGwgVXBcIiAgIFwiQ1NJIFBzIFNcIiAgXCJTY3JvbGwgYFBzYCBsaW5lcyB1cCAoZGVmYXVsdD0xKS5cIlxuICAgKlxuICAgKlxuICAgKiBGSVhNRTogc2Nyb2xsZWQgb3V0IGxpbmVzIGF0IHRvcCA9IDEgc2hvdWxkIGFkZCB0byBzY3JvbGxiYWNrICh4dGVybSlcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxVcChwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBsZXQgcGFyYW0gPSBwYXJhbXMucGFyYW1zWzBdIHx8IDE7XG5cbiAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNwbGljZSh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCAxKTtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSwgMCwgdGhpcy5fYWN0aXZlQnVmZmVyLmdldEJsYW5rTGluZSh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBUICBTY3JvbGwgZG93biBQcyBsaW5lcyAoZGVmYXVsdCA9IDEpIChTRCkuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFNEICBcIlNjcm9sbCBEb3duXCIgICBcIkNTSSBQcyBUXCIgIFwiU2Nyb2xsIGBQc2AgbGluZXMgZG93biAoZGVmYXVsdD0xKS5cIlxuICAgKi9cbiAgcHVibGljIHNjcm9sbERvd24ocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgbGV0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuXG4gICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5zcGxpY2UodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc3BsaWNlKHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIDAsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXRCbGFua0xpbmUoREVGQVVMVF9BVFRSX0RBVEEpKTtcbiAgICB9XG4gICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBTUCBAICBTY3JvbGwgbGVmdCBQcyBjb2x1bW5zIChkZWZhdWx0ID0gMSkgKFNMKSBFQ01BLTQ4XG4gICAqXG4gICAqIE5vdGF0aW9uOiAoUG4pXG4gICAqIFJlcHJlc2VudGF0aW9uOiBDU0kgUG4gMDIvMDAgMDQvMDBcbiAgICogUGFyYW1ldGVyIGRlZmF1bHQgdmFsdWU6IFBuID0gMVxuICAgKiBTTCBjYXVzZXMgdGhlIGRhdGEgaW4gdGhlIHByZXNlbnRhdGlvbiBjb21wb25lbnQgdG8gYmUgbW92ZWQgYnkgbiBjaGFyYWN0ZXIgcG9zaXRpb25zXG4gICAqIGlmIHRoZSBsaW5lIG9yaWVudGF0aW9uIGlzIGhvcml6b250YWwsIG9yIGJ5IG4gbGluZSBwb3NpdGlvbnMgaWYgdGhlIGxpbmUgb3JpZW50YXRpb25cbiAgICogaXMgdmVydGljYWwsIHN1Y2ggdGhhdCB0aGUgZGF0YSBhcHBlYXIgdG8gbW92ZSB0byB0aGUgbGVmdDsgd2hlcmUgbiBlcXVhbHMgdGhlIHZhbHVlIG9mIFBuLlxuICAgKiBUaGUgYWN0aXZlIHByZXNlbnRhdGlvbiBwb3NpdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBjb250cm9sIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQ6XG4gICAqICAgLSBhbHdheXMgbGVmdCBzaGlmdCAobm8gbGluZSBvcmllbnRhdGlvbiBzZXR0aW5nIHJlc3BlY3RlZClcbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgU0wgIFwiU2Nyb2xsIExlZnRcIiBcIkNTSSBQcyBTUCBAXCIgXCJTY3JvbGwgdmlld3BvcnQgYFBzYCB0aW1lcyB0byB0aGUgbGVmdC5cIlxuICAgKiBTTCBtb3ZlcyB0aGUgY29udGVudCBvZiBhbGwgbGluZXMgd2l0aGluIHRoZSBzY3JvbGwgbWFyZ2lucyBgUHNgIHRpbWVzIHRvIHRoZSBsZWZ0LlxuICAgKiBTTCBoYXMgbm8gZWZmZWN0IG91dHNpZGUgb2YgdGhlIHNjcm9sbCBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIHNjcm9sbExlZnQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuZGVsZXRlQ2VsbHMoMCwgcGFyYW0sIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgU1AgQSAgU2Nyb2xsIHJpZ2h0IFBzIGNvbHVtbnMgKGRlZmF1bHQgPSAxKSAoU1IpIEVDTUEtNDhcbiAgICpcbiAgICogTm90YXRpb246IChQbilcbiAgICogUmVwcmVzZW50YXRpb246IENTSSBQbiAwMi8wMCAwNC8wMVxuICAgKiBQYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZTogUG4gPSAxXG4gICAqIFNSIGNhdXNlcyB0aGUgZGF0YSBpbiB0aGUgcHJlc2VudGF0aW9uIGNvbXBvbmVudCB0byBiZSBtb3ZlZCBieSBuIGNoYXJhY3RlciBwb3NpdGlvbnNcbiAgICogaWYgdGhlIGxpbmUgb3JpZW50YXRpb24gaXMgaG9yaXpvbnRhbCwgb3IgYnkgbiBsaW5lIHBvc2l0aW9ucyBpZiB0aGUgbGluZSBvcmllbnRhdGlvblxuICAgKiBpcyB2ZXJ0aWNhbCwgc3VjaCB0aGF0IHRoZSBkYXRhIGFwcGVhciB0byBtb3ZlIHRvIHRoZSByaWdodDsgd2hlcmUgbiBlcXVhbHMgdGhlIHZhbHVlIG9mIFBuLlxuICAgKiBUaGUgYWN0aXZlIHByZXNlbnRhdGlvbiBwb3NpdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBjb250cm9sIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQ6XG4gICAqICAgLSBhbHdheXMgcmlnaHQgc2hpZnQgKG5vIGxpbmUgb3JpZW50YXRpb24gc2V0dGluZyByZXNwZWN0ZWQpXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIFNSICBcIlNjcm9sbCBSaWdodFwiICBcIkNTSSBQcyBTUCBBXCIgICBcIlNjcm9sbCB2aWV3cG9ydCBgUHNgIHRpbWVzIHRvIHRoZSByaWdodC5cIlxuICAgKiBTTCBtb3ZlcyB0aGUgY29udGVudCBvZiBhbGwgbGluZXMgd2l0aGluIHRoZSBzY3JvbGwgbWFyZ2lucyBgUHNgIHRpbWVzIHRvIHRoZSByaWdodC5cbiAgICogQ29udGVudCBhdCB0aGUgcmlnaHQgbWFyZ2luIGlzIGxvc3QuXG4gICAqIFNMIGhhcyBubyBlZmZlY3Qgb3V0c2lkZSBvZiB0aGUgc2Nyb2xsIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsUmlnaHQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuaW5zZXJ0Q2VsbHMoMCwgcGFyYW0sIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gJyB9XG4gICAqIEluc2VydCBQcyBDb2x1bW4ocykgKGRlZmF1bHQgPSAxKSAoREVDSUMpLCBWVDQyMCBhbmQgdXAuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERFQ0lDIFwiSW5zZXJ0IENvbHVtbnNcIiAgXCJDU0kgUHMgJyB9XCIgIFwiSW5zZXJ0IGBQc2AgY29sdW1ucyBhdCBjdXJzb3IgcG9zaXRpb24uXCJcbiAgICogREVDSUMgaW5zZXJ0cyBgUHNgIHRpbWVzIGJsYW5rIGNvbHVtbnMgYXQgdGhlIGN1cnNvciBwb3NpdGlvbiBmb3IgYWxsIGxpbmVzIHdpdGggdGhlIHNjcm9sbFxuICAgKiBtYXJnaW5zLCBtb3ZpbmcgY29udGVudCB0byB0aGUgcmlnaHQuIENvbnRlbnQgYXQgdGhlIHJpZ2h0IG1hcmdpbiBpcyBsb3N0LiBERUNJQyBoYXMgbm8gZWZmZWN0XG4gICAqIG91dHNpZGUgdGhlIHNjcm9sbGluZyBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGluc2VydENvbHVtbnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID4gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSB8fCB0aGlzLl9hY3RpdmVCdWZmZXIueSA8IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXJhbSA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBmb3IgKGxldCB5ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcDsgeSA8PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tOyArK3kpIHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHkpITtcbiAgICAgIGxpbmUuaW5zZXJ0Q2VsbHModGhpcy5fYWN0aXZlQnVmZmVyLngsIHBhcmFtLCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0TnVsbENlbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKSk7XG4gICAgICBsaW5lLmlzV3JhcHBlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya1JhbmdlRGlydHkodGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtICcgflxuICAgKiBEZWxldGUgUHMgQ29sdW1uKHMpIChkZWZhdWx0ID0gMSkgKERFQ0RDKSwgVlQ0MjAgYW5kIHVwLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNEQyBcIkRlbGV0ZSBDb2x1bW5zXCIgIFwiQ1NJIFBzICcgflwiICBcIkRlbGV0ZSBgUHNgIGNvbHVtbnMgYXQgY3Vyc29yIHBvc2l0aW9uLlwiXG4gICAqIERFQ0RDIGRlbGV0ZXMgYFBzYCB0aW1lcyBjb2x1bW5zIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24gZm9yIGFsbCBsaW5lcyB3aXRoIHRoZSBzY3JvbGwgbWFyZ2lucyxcbiAgICogbW92aW5nIGNvbnRlbnQgdG8gdGhlIGxlZnQuIEJsYW5rIGNvbHVtbnMgYXJlIGFkZGVkIGF0IHRoZSByaWdodCBtYXJnaW4uXG4gICAqIERFQ0RDIGhhcyBubyBlZmZlY3Qgb3V0c2lkZSB0aGUgc2Nyb2xsaW5nIG1hcmdpbnMuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlQ29sdW1ucyhwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPiB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tIHx8IHRoaXMuX2FjdGl2ZUJ1ZmZlci55IDwgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbFRvcCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIGZvciAobGV0IHkgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wOyB5IDw9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b207ICsreSkge1xuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgeSkhO1xuICAgICAgbGluZS5kZWxldGVDZWxscyh0aGlzLl9hY3RpdmVCdWZmZXIueCwgcGFyYW0sIHRoaXMuX2FjdGl2ZUJ1ZmZlci5nZXROdWxsQ2VsbCh0aGlzLl9lcmFzZUF0dHJEYXRhKCkpKTtcbiAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wLCB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUHMgWFxuICAgKiBFcmFzZSBQcyBDaGFyYWN0ZXIocykgKGRlZmF1bHQgPSAxKSAoRUNIKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgRUNIICAgXCJFcmFzZSBDaGFyYWN0ZXJcIiAgIFwiQ1NJIFBzIFhcIiAgXCJFcmFzZSBgUHNgIGNoYXJhY3RlcnMgZnJvbSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB0byB0aGUgcmlnaHQgKGRlZmF1bHQ9MSkuXCJcbiAgICogRUQgZXJhc2VzIGBQc2AgY2hhcmFjdGVycyBmcm9tIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIHRvIHRoZSByaWdodC5cbiAgICogRUQgd29ya3MgaW5zaWRlIG9yIG91dHNpZGUgdGhlIHNjcm9sbGluZyBtYXJnaW5zLlxuICAgKi9cbiAgcHVibGljIGVyYXNlQ2hhcnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLmdldCh0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2UgKyB0aGlzLl9hY3RpdmVCdWZmZXIueSk7XG4gICAgaWYgKGxpbmUpIHtcbiAgICAgIGxpbmUucmVwbGFjZUNlbGxzKFxuICAgICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueCxcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggKyAocGFyYW1zLnBhcmFtc1swXSB8fCAxKSxcbiAgICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmdldE51bGxDZWxsKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSlcbiAgICAgICk7XG4gICAgICB0aGlzLl9kaXJ0eVJvd1RyYWNrZXIubWFya0RpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci55KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIGIgIFJlcGVhdCB0aGUgcHJlY2VkaW5nIGdyYXBoaWMgY2hhcmFjdGVyIFBzIHRpbWVzIChSRVApLlxuICAgKiBGcm9tIEVDTUEgNDggKEBzZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNUL0VjbWEtMDQ4LnBkZilcbiAgICogICAgTm90YXRpb246IChQbilcbiAgICogICAgUmVwcmVzZW50YXRpb246IENTSSBQbiAwNi8wMlxuICAgKiAgICBQYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZTogUG4gPSAxXG4gICAqICAgIFJFUCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIHByZWNlZGluZyBjaGFyYWN0ZXIgaW4gdGhlIGRhdGEgc3RyZWFtLFxuICAgKiAgICBpZiBpdCBpcyBhIGdyYXBoaWMgY2hhcmFjdGVyIChyZXByZXNlbnRlZCBieSBvbmUgb3IgbW9yZSBiaXQgY29tYmluYXRpb25zKSBpbmNsdWRpbmcgU1BBQ0UsXG4gICAqICAgIGlzIHRvIGJlIHJlcGVhdGVkIG4gdGltZXMsIHdoZXJlIG4gZXF1YWxzIHRoZSB2YWx1ZSBvZiBQbi5cbiAgICogICAgSWYgdGhlIGNoYXJhY3RlciBwcmVjZWRpbmcgUkVQIGlzIGEgY29udHJvbCBmdW5jdGlvbiBvciBwYXJ0IG9mIGEgY29udHJvbCBmdW5jdGlvbixcbiAgICogICAgdGhlIGVmZmVjdCBvZiBSRVAgaXMgbm90IGRlZmluZWQgYnkgdGhpcyBTdGFuZGFyZC5cbiAgICpcbiAgICogV2UgZXh0ZW5kIHh0ZXJtJ3MgYmVoYXZpb3IgdG8gYWxsb3cgcmVwZWF0aW5nIGVudGlyZSBncmFwaGVtZSBjbHVzdGVycy5cbiAgICogVGhpcyBpc24ndCAxMDAlIHh0ZXJtLWNvbXBhdGlibGUsIGJ1dCBpdCBzZWVtcyBzYW5lciBhbmQgbW9yZSB1c2VmdWwuXG4gICAqICAgIC0gdGV4dCBhdHRycyBhcmUgYXBwbGllZCBub3JtYWxseVxuICAgKiAgICAtIHdyYXAgYXJvdW5kIGlzIHJlc3BlY3RlZFxuICAgKiAgICAtIGFueSB2YWxpZCBzZXF1ZW5jZSByZXNldHMgdGhlIGNhcnJpZWQgZm9yd2FyZCBjaGFyXG4gICAqXG4gICAqIE5vdGU6IFRvIGdldCByZXNldCBvbiBhIHZhbGlkIHNlcXVlbmNlIHdvcmtpbmcgY29ycmVjdGx5IHdpdGhvdXQgbXVjaCBydW50aW1lIHBlbmFsdHksIHRoZVxuICAgKiBwcmVjZWRpbmcgY29kZXBvaW50IGlzIHN0b3JlZCBvbiB0aGUgcGFyc2VyIGluIGB0aGlzLnByaW50YCBhbmQgcmVzZXQgZHVyaW5nIGBwYXJzZXIucGFyc2VgLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBSRVAgICBcIlJlcGVhdCBQcmVjZWRpbmcgQ2hhcmFjdGVyXCIgICAgXCJDU0kgUHMgYlwiICBcIlJlcGVhdCBwcmVjZWRpbmcgY2hhcmFjdGVyIGBQc2AgdGltZXMgKGRlZmF1bHQ9MSkuXCJcbiAgICogUkVQIHJlcGVhdHMgdGhlIHByZXZpb3VzIGNoYXJhY3RlciBgUHNgIHRpbWVzIGFkdmFuY2luZyB0aGUgY3Vyc29yLCBhbHNvIHdyYXBwaW5nIGlmIERFQ0FXTSBpc1xuICAgKiBzZXQuIFJFUCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBzZXF1ZW5jZSBkb2VzIG5vdCBmb2xsb3cgYSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVyXG4gICAqIChOT09QIGZvciBhbnkgb3RoZXIgc2VxdWVuY2UgaW4gYmV0d2VlbiBvciBOT04gQVNDSUkgY2hhcmFjdGVycykuXG4gICAqL1xuICBwdWJsaWMgcmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGpvaW5TdGF0ZSA9IHRoaXMuX3BhcnNlci5wcmVjZWRpbmdKb2luU3RhdGU7XG4gICAgaWYgKCFqb2luU3RhdGUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyBjYWxsIHByaW50IHRvIGluc2VydCB0aGUgY2hhcnMgYW5kIGhhbmRsZSBjb3JyZWN0IHdyYXBwaW5nXG4gICAgY29uc3QgbGVuZ3RoID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIGNvbnN0IGNoV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgoam9pblN0YXRlKTtcbiAgICBjb25zdCB4ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnggLSBjaFdpZHRoO1xuICAgIGNvbnN0IGJ1ZmZlclJvdyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5saW5lcy5nZXQodGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnkpITtcbiAgICBjb25zdCB0ZXh0ID0gYnVmZmVyUm93LmdldFN0cmluZyh4KTtcbiAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHRleHQubGVuZ3RoICogbGVuZ3RoKTtcbiAgICBsZXQgaWRhdGEgPSAwO1xuICAgIGZvciAobGV0IGl0ZXh0ID0gMDsgaXRleHQgPCB0ZXh0Lmxlbmd0aDsgKSB7XG4gICAgICBjb25zdCBjaCA9IHRleHQuY29kZVBvaW50QXQoaXRleHQpIHx8IDA7XG4gICAgICBkYXRhW2lkYXRhKytdID0gY2g7XG4gICAgICBpdGV4dCArPSBjaCA+IDB4ZmZmZiA/IDIgOiAxO1xuICAgIH1cbiAgICBsZXQgdGxlbmd0aCA9IGlkYXRhO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGRhdGEuY29weVdpdGhpbih0bGVuZ3RoLCAwLCBpZGF0YSk7XG4gICAgICB0bGVuZ3RoICs9IGlkYXRhO1xuICAgIH1cbiAgICB0aGlzLnByaW50KGRhdGEsIDAsIHRsZW5ndGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyBjICBTZW5kIERldmljZSBBdHRyaWJ1dGVzIChQcmltYXJ5IERBKS5cbiAgICogICAgIFBzID0gMCAgb3Igb21pdHRlZCAtPiByZXF1ZXN0IGF0dHJpYnV0ZXMgZnJvbSB0ZXJtaW5hbC4gIFRoZVxuICAgKiAgICAgcmVzcG9uc2UgZGVwZW5kcyBvbiB0aGUgZGVjVGVybWluYWxJRCByZXNvdXJjZSBzZXR0aW5nLlxuICAgKiAgICAgLT4gQ1NJID8gMSA7IDIgYyAgKGBgVlQxMDAgd2l0aCBBZHZhbmNlZCBWaWRlbyBPcHRpb24nJylcbiAgICogICAgIC0+IENTSSA/IDEgOyAwIGMgIChgYFZUMTAxIHdpdGggTm8gT3B0aW9ucycnKVxuICAgKiAgICAgLT4gQ1NJID8gNiBjICAoYGBWVDEwMicnKVxuICAgKiAgICAgLT4gQ1NJID8gNiAwIDsgMSA7IDIgOyA2IDsgOCA7IDkgOyAxIDUgOyBjICAoYGBWVDIyMCcnKVxuICAgKiAgIFRoZSBWVDEwMC1zdHlsZSByZXNwb25zZSBwYXJhbWV0ZXJzIGRvIG5vdCBtZWFuIGFueXRoaW5nIGJ5XG4gICAqICAgdGhlbXNlbHZlcy4gIFZUMjIwIHBhcmFtZXRlcnMgZG8sIHRlbGxpbmcgdGhlIGhvc3Qgd2hhdCBmZWEtXG4gICAqICAgdHVyZXMgdGhlIHRlcm1pbmFsIHN1cHBvcnRzOlxuICAgKiAgICAgUHMgPSAxICAtPiAxMzItY29sdW1ucy5cbiAgICogICAgIFBzID0gMiAgLT4gUHJpbnRlci5cbiAgICogICAgIFBzID0gNiAgLT4gU2VsZWN0aXZlIGVyYXNlLlxuICAgKiAgICAgUHMgPSA4ICAtPiBVc2VyLWRlZmluZWQga2V5cy5cbiAgICogICAgIFBzID0gOSAgLT4gTmF0aW9uYWwgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIHNldHMuXG4gICAqICAgICBQcyA9IDEgNSAgLT4gVGVjaG5pY2FsIGNoYXJhY3RlcnMuXG4gICAqICAgICBQcyA9IDIgMiAgLT4gQU5TSSBjb2xvciwgZS5nLiwgVlQ1MjUuXG4gICAqICAgICBQcyA9IDIgOSAgLT4gQU5TSSB0ZXh0IGxvY2F0b3IgKGkuZS4sIERFQyBMb2NhdG9yIG1vZGUpLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBEQTEgICBcIlByaW1hcnkgRGV2aWNlIEF0dHJpYnV0ZXNcIiAgICAgXCJDU0kgY1wiICBcIlNlbmQgcHJpbWFyeSBkZXZpY2UgYXR0cmlidXRlcy5cIlxuICAgKlxuICAgKlxuICAgKiBUT0RPOiBmaXggYW5kIGNsZWFudXAgcmVzcG9uc2VcbiAgICovXG4gIHB1YmxpYyBzZW5kRGV2aWNlQXR0cmlidXRlc1ByaW1hcnkocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhcmFtcy5wYXJhbXNbMF0gPiAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzKCd4dGVybScpIHx8IHRoaXMuX2lzKCdyeHZ0LXVuaWNvZGUnKSB8fCB0aGlzLl9pcygnc2NyZWVuJykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s/MTsyYycpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faXMoJ2xpbnV4JykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s/NmMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJID4gUHMgY1xuICAgKiAgIFNlbmQgRGV2aWNlIEF0dHJpYnV0ZXMgKFNlY29uZGFyeSBEQSkuXG4gICAqICAgICBQcyA9IDAgIG9yIG9taXR0ZWQgLT4gcmVxdWVzdCB0aGUgdGVybWluYWwncyBpZGVudGlmaWNhdGlvblxuICAgKiAgICAgY29kZS4gIFRoZSByZXNwb25zZSBkZXBlbmRzIG9uIHRoZSBkZWNUZXJtaW5hbElEIHJlc291cmNlIHNldC1cbiAgICogICAgIHRpbmcuICBJdCBzaG91bGQgYXBwbHkgb25seSB0byBWVDIyMCBhbmQgdXAsIGJ1dCB4dGVybSBleHRlbmRzXG4gICAqICAgICB0aGlzIHRvIFZUMTAwLlxuICAgKiAgICAgLT4gQ1NJICA+IFBwIDsgUHYgOyBQYyBjXG4gICAqICAgd2hlcmUgUHAgZGVub3RlcyB0aGUgdGVybWluYWwgdHlwZVxuICAgKiAgICAgUHAgPSAwICAtPiBgYFZUMTAwJycuXG4gICAqICAgICBQcCA9IDEgIC0+IGBgVlQyMjAnJy5cbiAgICogICBhbmQgUHYgaXMgdGhlIGZpcm13YXJlIHZlcnNpb24gKGZvciB4dGVybSwgdGhpcyB3YXMgb3JpZ2luYWxseVxuICAgKiAgIHRoZSBYRnJlZTg2IHBhdGNoIG51bWJlciwgc3RhcnRpbmcgd2l0aCA5NSkuICBJbiBhIERFQyB0ZXJtaS1cbiAgICogICBuYWwsIFBjIGluZGljYXRlcyB0aGUgUk9NIGNhcnRyaWRnZSByZWdpc3RyYXRpb24gbnVtYmVyIGFuZCBpc1xuICAgKiAgIGFsd2F5cyB6ZXJvLlxuICAgKiBNb3JlIGluZm9ybWF0aW9uOlxuICAgKiAgIHh0ZXJtL2NoYXJwcm9jLmMgLSBsaW5lIDIwMTIsIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKiAgIHZpbSByZXNwb25kcyB3aXRoIF5bWz8wYyBvciBeW1s/MWMgYWZ0ZXIgdGhlIHRlcm1pbmFsJ3MgcmVzcG9uc2UgKD8pXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERBMiAgIFwiU2Vjb25kYXJ5IERldmljZSBBdHRyaWJ1dGVzXCIgICBcIkNTSSA+IGNcIiBcIlNlbmQgcHJpbWFyeSBkZXZpY2UgYXR0cmlidXRlcy5cIlxuICAgKlxuICAgKlxuICAgKiBUT0RPOiBmaXggYW5kIGNsZWFudXAgcmVzcG9uc2VcbiAgICovXG4gIHB1YmxpYyBzZW5kRGV2aWNlQXR0cmlidXRlc1NlY29uZGFyeShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBpZiAocGFyYW1zLnBhcmFtc1swXSA+IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvLyB4dGVybSBhbmQgdXJ4dnRcbiAgICAvLyBzZWVtIHRvIHNwaXQgdGhpc1xuICAgIC8vIG91dCBhcm91bmQgfjM3MCB0aW1lcyAoPykuXG4gICAgaWYgKHRoaXMuX2lzKCd4dGVybScpKSB7XG4gICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KEMwLkVTQyArICdbPjA7Mjc2OzBjJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9pcygncnh2dC11bmljb2RlJykpIHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoQzAuRVNDICsgJ1s+ODU7OTU7MGMnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzKCdsaW51eCcpKSB7XG4gICAgICAvLyBub3Qgc3VwcG9ydGVkIGJ5IGxpbnV4IGNvbnNvbGUuXG4gICAgICAvLyBsaW51eCBjb25zb2xlIGVjaG9lcyBwYXJhbWV0ZXJzLlxuICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChwYXJhbXMucGFyYW1zWzBdICsgJ2MnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lzKCdzY3JlZW4nKSkge1xuICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChDMC5FU0MgKyAnWz44Mzs0MDAwMzswYycpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBpZiB0aGUgY3VycmVudCB0ZXJtaW5hbCBpcyB0aGUgZ2l2ZW4gYXJndW1lbnQuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSB0ZXJtaW5hbCBuYW1lIHRvIGV2YWx1YXRlXG4gICAqL1xuICBwcml2YXRlIF9pcyh0ZXJtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMudGVybU5hbWUgKyAnJykuaW5kZXhPZih0ZXJtKSA9PT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgUG0gaCAgU2V0IE1vZGUgKFNNKS5cbiAgICogICAgIFBzID0gMiAgLT4gS2V5Ym9hcmQgQWN0aW9uIE1vZGUgKEFNKS5cbiAgICogICAgIFBzID0gNCAgLT4gSW5zZXJ0IE1vZGUgKElSTSkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU2VuZC9yZWNlaXZlIChTUk0pLlxuICAgKiAgICAgUHMgPSAyIDAgIC0+IEF1dG9tYXRpYyBOZXdsaW5lIChMTk0pLlxuICAgKlxuICAgKiBAdnQ6ICNQW09ubHkgSVJNIGlzIHN1cHBvcnRlZC5dICAgIENTSSBTTSAgICBcIlNldCBNb2RlXCIgIFwiQ1NJIFBtIGhcIiAgXCJTZXQgdmFyaW91cyB0ZXJtaW5hbCBtb2Rlcy5cIlxuICAgKiBTdXBwb3J0ZWQgcGFyYW0gdmFsdWVzIGJ5IFNNOlxuICAgKlxuICAgKiB8IFBhcmFtIHwgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8XG4gICAqIHwgMiAgICAgfCBLZXlib2FyZCBBY3Rpb24gTW9kZSAoS0FNKS4gQWx3YXlzIG9uLiB8ICNOICAgICAgfFxuICAgKiB8IDQgICAgIHwgSW5zZXJ0IE1vZGUgKElSTSkuICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMiAgICB8IFNlbmQvcmVjZWl2ZSAoU1JNKS4gQWx3YXlzIG9mZi4gICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMjAgICAgfCBBdXRvbWF0aWMgTmV3bGluZSAoTE5NKS4gICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKi9cbiAgcHVibGljIHNldE1vZGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1tpXSkge1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jb252ZXJ0RW9sID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJID8gUG0gaFxuICAgKiAgIERFQyBQcml2YXRlIE1vZGUgU2V0IChERUNTRVQpLlxuICAgKiAgICAgUHMgPSAxICAtPiBBcHBsaWNhdGlvbiBDdXJzb3IgS2V5cyAoREVDQ0tNKS5cbiAgICogICAgIFBzID0gMiAgLT4gRGVzaWduYXRlIFVTQVNDSUkgZm9yIGNoYXJhY3RlciBzZXRzIEcwLUczXG4gICAqICAgICAoREVDQU5NKSwgYW5kIHNldCBWVDEwMCBtb2RlLlxuICAgKiAgICAgUHMgPSAzICAtPiAxMzIgQ29sdW1uIE1vZGUgKERFQ0NPTE0pLlxuICAgKiAgICAgUHMgPSA0ICAtPiBTbW9vdGggKFNsb3cpIFNjcm9sbCAoREVDU0NMTSkuXG4gICAqICAgICBQcyA9IDUgIC0+IFJldmVyc2UgVmlkZW8gKERFQ1NDTk0pLlxuICAgKiAgICAgUHMgPSA2ICAtPiBPcmlnaW4gTW9kZSAoREVDT00pLlxuICAgKiAgICAgUHMgPSA3ICAtPiBXcmFwYXJvdW5kIE1vZGUgKERFQ0FXTSkuXG4gICAqICAgICBQcyA9IDggIC0+IEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuXG4gICAqICAgICBQcyA9IDkgIC0+IFNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzLiAgU2VlIHRoZSBzZWMtXG4gICAqICAgICB0aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgIC0+IFNob3cgdG9vbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU3RhcnQgQmxpbmtpbmcgQ3Vyc29yIChhdHQ2MTApLlxuICAgKiAgICAgUHMgPSAxIDggIC0+IFByaW50IGZvcm0gZmVlZCAoREVDUEZGKS5cbiAgICogICAgIFBzID0gMSA5ICAtPiBTZXQgcHJpbnQgZXh0ZW50IHRvIGZ1bGwgc2NyZWVuIChERUNQRVgpLlxuICAgKiAgICAgUHMgPSAyIDUgIC0+IFNob3cgQ3Vyc29yIChERUNUQ0VNKS5cbiAgICogICAgIFBzID0gMyAwICAtPiBTaG93IHNjcm9sbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDMgNSAgLT4gRW5hYmxlIGZvbnQtc2hpZnRpbmcgZnVuY3Rpb25zIChyeHZ0KS5cbiAgICogICAgIFBzID0gMyA4ICAtPiBFbnRlciBUZWt0cm9uaXggTW9kZSAoREVDVEVLKS5cbiAgICogICAgIFBzID0gNCAwICAtPiBBbGxvdyA4MCAtPiAxMzIgTW9kZS5cbiAgICogICAgIFBzID0gNCAxICAtPiBtb3JlKDEpIGZpeCAoc2VlIGN1cnNlcyByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDQgMiAgLT4gRW5hYmxlIE5hdGlvbiBSZXBsYWNlbWVudCBDaGFyYWN0ZXIgc2V0cyAoREVDTi1cbiAgICogICAgIFJDTSkuXG4gICAqICAgICBQcyA9IDQgNCAgLT4gVHVybiBPbiBNYXJnaW4gQmVsbC5cbiAgICogICAgIFBzID0gNCA1ICAtPiBSZXZlcnNlLXdyYXBhcm91bmQgTW9kZS5cbiAgICogICAgIFBzID0gNCA2ICAtPiBTdGFydCBMb2dnaW5nLiAgVGhpcyBpcyBub3JtYWxseSBkaXNhYmxlZCBieSBhXG4gICAqICAgICBjb21waWxlLXRpbWUgb3B0aW9uLlxuICAgKiAgICAgUHMgPSA0IDcgIC0+IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gIChUaGlzIG1heSBiZSBkaXMtXG4gICAqICAgICBhYmxlZCBieSB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSA2IDYgIC0+IEFwcGxpY2F0aW9uIGtleXBhZCAoREVDTktNKS5cbiAgICogICAgIFBzID0gNiA3ICAtPiBCYWNrYXJyb3cga2V5IHNlbmRzIGJhY2tzcGFjZSAoREVDQktNKS5cbiAgICogICAgIFBzID0gMSAwIDAgMCAgLT4gU2VuZCBNb3VzZSBYICYgWSBvbiBidXR0b24gcHJlc3MgYW5kXG4gICAqICAgICByZWxlYXNlLiAgU2VlIHRoZSBzZWN0aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAxICAtPiBVc2UgSGlsaXRlIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAyICAtPiBVc2UgQ2VsbCBNb3Rpb24gTW91c2UgVHJhY2tpbmcuXG4gICAqICAgICBQcyA9IDEgMCAwIDMgIC0+IFVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCA0ICAtPiBTZW5kIEZvY3VzSW4vRm9jdXNPdXQgZXZlbnRzLlxuICAgKiAgICAgUHMgPSAxIDAgMCA1ICAtPiBFbmFibGUgRXh0ZW5kZWQgTW91c2UgTW9kZS5cbiAgICogICAgIFBzID0gMSAwIDEgMCAgLT4gU2Nyb2xsIHRvIGJvdHRvbSBvbiB0dHkgb3V0cHV0IChyeHZ0KS5cbiAgICogICAgIFBzID0gMSAwIDEgMSAgLT4gU2Nyb2xsIHRvIGJvdHRvbSBvbiBrZXkgcHJlc3MgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA0ICAtPiBJbnRlcnByZXQgXCJtZXRhXCIga2V5LCBzZXRzIGVpZ2h0aCBiaXQuXG4gICAqICAgICAoZW5hYmxlcyB0aGUgZWlnaHRCaXRJbnB1dCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCAzIDUgIC0+IEVuYWJsZSBzcGVjaWFsIG1vZGlmaWVycyBmb3IgQWx0IGFuZCBOdW0tXG4gICAqICAgICBMb2NrIGtleXMuICAoVGhpcyBlbmFibGVzIHRoZSBudW1Mb2NrIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNiAgLT4gU2VuZCBFU0MgICB3aGVuIE1ldGEgbW9kaWZpZXMgYSBrZXkuICAoVGhpc1xuICAgKiAgICAgZW5hYmxlcyB0aGUgbWV0YVNlbmRzRXNjYXBlIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNyAgLT4gU2VuZCBERUwgZnJvbSB0aGUgZWRpdGluZy1rZXlwYWQgRGVsZXRlXG4gICAqICAgICBrZXkuXG4gICAqICAgICBQcyA9IDEgMCAzIDkgIC0+IFNlbmQgRVNDICB3aGVuIEFsdCBtb2RpZmllcyBhIGtleS4gIChUaGlzXG4gICAqICAgICBlbmFibGVzIHRoZSBhbHRTZW5kc0VzY2FwZSByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDAgIC0+IEtlZXAgc2VsZWN0aW9uIGV2ZW4gaWYgbm90IGhpZ2hsaWdodGVkLlxuICAgKiAgICAgKFRoaXMgZW5hYmxlcyB0aGUga2VlcFNlbGVjdGlvbiByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDEgIC0+IFVzZSB0aGUgQ0xJUEJPQVJEIHNlbGVjdGlvbi4gIChUaGlzIGVuYWJsZXNcbiAgICogICAgIHRoZSBzZWxlY3RUb0NsaXBib2FyZCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDIgIC0+IEVuYWJsZSBVcmdlbmN5IHdpbmRvdyBtYW5hZ2VyIGhpbnQgd2hlblxuICAgKiAgICAgQ29udHJvbC1HIGlzIHJlY2VpdmVkLiAgKFRoaXMgZW5hYmxlcyB0aGUgYmVsbElzVXJnZW50XG4gICAqICAgICByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDMgIC0+IEVuYWJsZSByYWlzaW5nIG9mIHRoZSB3aW5kb3cgd2hlbiBDb250cm9sLUdcbiAgICogICAgIGlzIHJlY2VpdmVkLiAgKGVuYWJsZXMgdGhlIHBvcE9uQmVsbCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDcgIC0+IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gIChUaGlzIG1heSBiZVxuICAgKiAgICAgZGlzYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgOCAgLT4gU2F2ZSBjdXJzb3IgYXMgaW4gREVDU0MuICAoVGhpcyBtYXkgYmUgZGlzLVxuICAgKiAgICAgYWJsZWQgYnkgdGhlIHRpdGVJbmhpYml0IHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgOSAgLT4gU2F2ZSBjdXJzb3IgYXMgaW4gREVDU0MgYW5kIHVzZSBBbHRlcm5hdGVcbiAgICogICAgIFNjcmVlbiBCdWZmZXIsIGNsZWFyaW5nIGl0IGZpcnN0LiAgKFRoaXMgbWF5IGJlIGRpc2FibGVkIGJ5XG4gICAqICAgICB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLiAgVGhpcyBjb21iaW5lcyB0aGUgZWZmZWN0cyBvZiB0aGUgMVxuICAgKiAgICAgMCA0IDcgIGFuZCAxIDAgNCA4ICBtb2Rlcy4gIFVzZSB0aGlzIHdpdGggdGVybWluZm8tYmFzZWRcbiAgICogICAgIGFwcGxpY2F0aW9ucyByYXRoZXIgdGhhbiB0aGUgNCA3ICBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNSAwICAtPiBTZXQgdGVybWluZm8vdGVybWNhcCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMSAgLT4gU2V0IFN1biBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMiAgLT4gU2V0IEhQIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNSAzICAtPiBTZXQgU0NPIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNiAwICAtPiBTZXQgbGVnYWN5IGtleWJvYXJkIGVtdWxhdGlvbiAoWDExUjYpLlxuICAgKiAgICAgUHMgPSAxIDAgNiAxICAtPiBTZXQgVlQyMjAga2V5Ym9hcmQgZW11bGF0aW9uLlxuICAgKiAgICAgUHMgPSAyIDAgMCA0ICAtPiBTZXQgYnJhY2tldGVkIHBhc3RlIG1vZGUuXG4gICAqIE1vZGVzOlxuICAgKiAgIGh0dHA6ICp2dDEwMC5uZXQvZG9jcy92dDIyMC1ybS9jaGFwdGVyNC5odG1sXG4gICAqXG4gICAqIEB2dDogI1BbU2VlIGJlbG93IGZvciBzdXBwb3J0ZWQgbW9kZXMuXSAgICBDU0kgREVDU0VUICBcIkRFQyBQcml2YXRlIFNldCBNb2RlXCIgXCJDU0kgPyBQbSBoXCIgIFwiU2V0IHZhcmlvdXMgdGVybWluYWwgYXR0cmlidXRlcy5cIlxuICAgKiBTdXBwb3J0ZWQgcGFyYW0gdmFsdWVzIGJ5IERFQ1NFVDpcbiAgICpcbiAgICogfCBwYXJhbSB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLXxcbiAgICogfCAxICAgICB8IEFwcGxpY2F0aW9uIEN1cnNvciBLZXlzIChERUNDS00pLiAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICB8IERlc2lnbmF0ZSBVUy1BU0NJSSBmb3IgY2hhcmFjdGVyIHNldHMgRzAtRzMgKERFQ0FOTSkuICAgfCAjWSAgICAgIHxcbiAgICogfCAzICAgICB8IDEzMiBDb2x1bW4gTW9kZSAoREVDQ09MTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA2ICAgICB8IE9yaWdpbiBNb2RlIChERUNPTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA3ICAgICB8IEF1dG8td3JhcCBNb2RlIChERUNBV00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA4ICAgICB8IEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuIEFsd2F5cyBvbi4gICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCA5ICAgICB8IFgxMCB4dGVybSBtb3VzZSBwcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMiAgICB8IFN0YXJ0IEJsaW5raW5nIEN1cnNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNSAgICB8IFNob3cgQ3Vyc29yIChERUNUQ0VNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NSAgICB8IFJldmVyc2Ugd3JhcC1hcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NyAgICB8IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA2NiAgICB8IEFwcGxpY2F0aW9uIGtleXBhZCAoREVDTktNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAwICB8IFgxMSB4dGVybSBtb3VzZSBwcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAyICB8IFVzZSBDZWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAzICB8IFVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA0ICB8IFNlbmQgRm9jdXNJbi9Gb2N1c091dCBldmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA1ICB8IEVuYWJsZSBVVEYtOCBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDA2ICB8IEVuYWJsZSBTR1IgTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDE1ICB8IEVuYWJsZSB1cnh2dCBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDE2ICB8IEVuYWJsZSBTR1ItUGl4ZWxzIE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ3ICB8IFVzZSBBbHRlcm5hdGUgU2NyZWVuIEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ4ICB8IFNhdmUgY3Vyc29yIGFzIGluIERFQ1NDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ5ICB8IFNhdmUgY3Vyc29yIGFuZCBzd2l0Y2ggdG8gYWx0ZXJuYXRlIGJ1ZmZlciBjbGVhcmluZyBpdC4gfCAjUFtEb2VzIG5vdCBjbGVhciB0aGUgYWx0ZXJuYXRlIGJ1ZmZlci5dIHxcbiAgICogfCAyMDA0ICB8IFNldCBicmFja2V0ZWQgcGFzdGUgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IGltcGxlbWVudCBERUNTQ05NLCAxMDQ5IHNob3VsZCBjbGVhciBhbHRidWZmZXJcbiAgICovXG4gIHB1YmxpYyBzZXRNb2RlUHJpdmF0ZShwYXJhbXM6IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgc3dpdGNoIChwYXJhbXMucGFyYW1zW2ldKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuYXBwbGljYXRpb25DdXJzb3JLZXlzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KDAsIERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMSwgREVGQVVMVF9DSEFSU0VUKTtcbiAgICAgICAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnQ2hhcnNldCgyLCBERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLnNldGdDaGFyc2V0KDMsIERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgLy8gc2V0IFZUMTAwIG1vZGUgaGVyZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogREVDQ09MTSAtIDEzMiBjb2x1bW4gbW9kZS5cbiAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgYWN0aXZlIGlmICdTZXRXaW5MaW5lcycgKDI0KSBpcyBlbmFibGVkXG4gICAgICAgICAgICogdGhyb3VnaCBgb3B0aW9ucy53aW5kb3dzT3B0aW9uc2AuXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcykge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5yZXNpemUoMTMyLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpO1xuICAgICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVzZXQuZmlyZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5vcmlnaW4gPSB0cnVlO1xuICAgICAgICAgIHRoaXMuX3NldEN1cnNvcigwLCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvckJsaW5rID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMucmV2ZXJzZVdyYXBhcm91bmQgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1NlcmlhbCBwb3J0IHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBrZXlwYWQuJyk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA5OiAvLyBYMTAgTW91c2VcbiAgICAgICAgICAvLyBubyByZWxlYXNlLCBubyBtb3Rpb24sIG5vIHdoZWVsLCBubyBtb2RpZmllcnMuXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCA9ICdYMTAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDA6IC8vIHZ0MjAwIG1vdXNlXG4gICAgICAgICAgLy8gbm8gbW90aW9uLlxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSAnVlQyMDAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDI6IC8vIGJ1dHRvbiBldmVudCBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlUHJvdG9jb2wgPSAnRFJBRyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwMzogLy8gYW55IGV2ZW50IG1vdXNlXG4gICAgICAgICAgLy8gYW55IGV2ZW50IC0gc2VuZHMgbW90aW9uIGV2ZW50cyxcbiAgICAgICAgICAvLyBldmVuIGlmIHRoZXJlIGlzIG5vIGJ1dHRvbiBoZWxkIGRvd24uXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCA9ICdBTlknO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDQ6IC8vIHNlbmQgZm9jdXNpbi9mb2N1c291dCBldmVudHNcbiAgICAgICAgICAvLyBmb2N1c2luOiBeW1tJXG4gICAgICAgICAgLy8gZm9jdXNvdXQ6IF5bW09cbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTZW5kRm9jdXMuZmlyZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDU6IC8vIHV0ZjggZXh0IG1vZGUgbW91c2UgLSByZW1vdmVkIGluICMyNTA3XG4gICAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnREVDU0VUIDEwMDUgbm90IHN1cHBvcnRlZCAoc2VlICMyNTA3KScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDY6IC8vIHNnciBleHQgbW9kZSBtb3VzZVxuICAgICAgICAgIHRoaXMuX2NvcmVNb3VzZVNlcnZpY2UuYWN0aXZlRW5jb2RpbmcgPSAnU0dSJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDE1OiAvLyB1cnh2dCBleHQgbW9kZSBtb3VzZSAtIHJlbW92ZWQgaW4gIzI1MDdcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdERUNTRVQgMTAxNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAxNjogLy8gc2dyIHBpeGVscyBtb2RlIG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVFbmNvZGluZyA9ICdTR1JfUElYRUxTJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTogLy8gc2hvdyBjdXJzb3JcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwNDg6IC8vIGFsdCBzY3JlZW4gY3Vyc29yXG4gICAgICAgICAgdGhpcy5zYXZlQ3Vyc29yKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA0OTogLy8gYWx0IHNjcmVlbiBidWZmZXIgY3Vyc29yXG4gICAgICAgICAgdGhpcy5zYXZlQ3Vyc29yKCk7XG4gICAgICAgIC8vIEZBTEwtVEhST1VHSFxuICAgICAgICBjYXNlIDQ3OiAvLyBhbHQgc2NyZWVuIGJ1ZmZlclxuICAgICAgICBjYXNlIDEwNDc6IC8vIGFsdCBzY3JlZW4gYnVmZmVyXG4gICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXJzLmFjdGl2YXRlQWx0QnVmZmVyKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZmlyZSgwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMDA0OiAvLyBicmFja2V0ZWQgcGFzdGUgbW9kZSAoaHR0cHM6Ly9jaXJ3LmluL2Jsb2cvYnJhY2tldGVkLXBhc3RlKVxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGUgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENTSSBQbSBsICBSZXNldCBNb2RlIChSTSkuXG4gICAqICAgICBQcyA9IDIgIC0+IEtleWJvYXJkIEFjdGlvbiBNb2RlIChBTSkuXG4gICAqICAgICBQcyA9IDQgIC0+IFJlcGxhY2UgTW9kZSAoSVJNKS5cbiAgICogICAgIFBzID0gMSAyICAtPiBTZW5kL3JlY2VpdmUgKFNSTSkuXG4gICAqICAgICBQcyA9IDIgMCAgLT4gTm9ybWFsIExpbmVmZWVkIChMTk0pLlxuICAgKlxuICAgKiBAdnQ6ICNQW09ubHkgSVJNIGlzIHN1cHBvcnRlZC5dICAgIENTSSBSTSAgICBcIlJlc2V0IE1vZGVcIiAgXCJDU0kgUG0gbFwiICBcIlNldCB2YXJpb3VzIHRlcm1pbmFsIGF0dHJpYnV0ZXMuXCJcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlcyBieSBSTTpcbiAgICpcbiAgICogfCBQYXJhbSB8IEFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3VwcG9ydCB8XG4gICAqIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDIgICAgIHwgS2V5Ym9hcmQgQWN0aW9uIE1vZGUgKEtBTSkuIEFsd2F5cyBvbi4gfCAjTiAgICAgIHxcbiAgICogfCA0ICAgICB8IFJlcGxhY2UgTW9kZSAoSVJNKS4gKGRlZmF1bHQpICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMTIgICAgfCBTZW5kL3JlY2VpdmUgKFNSTSkuIEFsd2F5cyBvZmYuICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDIwICAgIHwgTm9ybWFsIExpbmVmZWVkIChMTk0pLiAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IHdoeSBpcyBMTk0gY29tbWVudGVkIG91dD9cbiAgICovXG4gIHB1YmxpYyByZXNldE1vZGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1tpXSkge1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UubW9kZXMuaW5zZXJ0TW9kZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY29udmVydEVvbCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU0kgPyBQbSBsXG4gICAqICAgREVDIFByaXZhdGUgTW9kZSBSZXNldCAoREVDUlNUKS5cbiAgICogICAgIFBzID0gMSAgLT4gTm9ybWFsIEN1cnNvciBLZXlzIChERUNDS00pLlxuICAgKiAgICAgUHMgPSAyICAtPiBEZXNpZ25hdGUgVlQ1MiBtb2RlIChERUNBTk0pLlxuICAgKiAgICAgUHMgPSAzICAtPiA4MCBDb2x1bW4gTW9kZSAoREVDQ09MTSkuXG4gICAqICAgICBQcyA9IDQgIC0+IEp1bXAgKEZhc3QpIFNjcm9sbCAoREVDU0NMTSkuXG4gICAqICAgICBQcyA9IDUgIC0+IE5vcm1hbCBWaWRlbyAoREVDU0NOTSkuXG4gICAqICAgICBQcyA9IDYgIC0+IE5vcm1hbCBDdXJzb3IgTW9kZSAoREVDT00pLlxuICAgKiAgICAgUHMgPSA3ICAtPiBObyBXcmFwYXJvdW5kIE1vZGUgKERFQ0FXTSkuXG4gICAqICAgICBQcyA9IDggIC0+IE5vIEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuXG4gICAqICAgICBQcyA9IDkgIC0+IERvbid0IHNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzLlxuICAgKiAgICAgUHMgPSAxIDAgIC0+IEhpZGUgdG9vbGJhciAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMiAgLT4gU3RvcCBCbGlua2luZyBDdXJzb3IgKGF0dDYxMCkuXG4gICAqICAgICBQcyA9IDEgOCAgLT4gRG9uJ3QgcHJpbnQgZm9ybSBmZWVkIChERUNQRkYpLlxuICAgKiAgICAgUHMgPSAxIDkgIC0+IExpbWl0IHByaW50IHRvIHNjcm9sbGluZyByZWdpb24gKERFQ1BFWCkuXG4gICAqICAgICBQcyA9IDIgNSAgLT4gSGlkZSBDdXJzb3IgKERFQ1RDRU0pLlxuICAgKiAgICAgUHMgPSAzIDAgIC0+IERvbid0IHNob3cgc2Nyb2xsYmFyIChyeHZ0KS5cbiAgICogICAgIFBzID0gMyA1ICAtPiBEaXNhYmxlIGZvbnQtc2hpZnRpbmcgZnVuY3Rpb25zIChyeHZ0KS5cbiAgICogICAgIFBzID0gNCAwICAtPiBEaXNhbGxvdyA4MCAtPiAxMzIgTW9kZS5cbiAgICogICAgIFBzID0gNCAxICAtPiBObyBtb3JlKDEpIGZpeCAoc2VlIGN1cnNlcyByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDQgMiAgLT4gRGlzYWJsZSBOYXRpb24gUmVwbGFjZW1lbnQgQ2hhcmFjdGVyIHNldHMgKERFQy1cbiAgICogICAgIE5SQ00pLlxuICAgKiAgICAgUHMgPSA0IDQgIC0+IFR1cm4gT2ZmIE1hcmdpbiBCZWxsLlxuICAgKiAgICAgUHMgPSA0IDUgIC0+IE5vIFJldmVyc2Utd3JhcGFyb3VuZCBNb2RlLlxuICAgKiAgICAgUHMgPSA0IDYgIC0+IFN0b3AgTG9nZ2luZy4gIChUaGlzIGlzIG5vcm1hbGx5IGRpc2FibGVkIGJ5IGFcbiAgICogICAgIGNvbXBpbGUtdGltZSBvcHRpb24pLlxuICAgKiAgICAgUHMgPSA0IDcgIC0+IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlci5cbiAgICogICAgIFBzID0gNiA2ICAtPiBOdW1lcmljIGtleXBhZCAoREVDTktNKS5cbiAgICogICAgIFBzID0gNiA3ICAtPiBCYWNrYXJyb3cga2V5IHNlbmRzIGRlbGV0ZSAoREVDQktNKS5cbiAgICogICAgIFBzID0gMSAwIDAgMCAgLT4gRG9uJ3Qgc2VuZCBNb3VzZSBYICYgWSBvbiBidXR0b24gcHJlc3MgYW5kXG4gICAqICAgICByZWxlYXNlLiAgU2VlIHRoZSBzZWN0aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAxICAtPiBEb24ndCB1c2UgSGlsaXRlIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCAyICAtPiBEb24ndCB1c2UgQ2VsbCBNb3Rpb24gTW91c2UgVHJhY2tpbmcuXG4gICAqICAgICBQcyA9IDEgMCAwIDMgIC0+IERvbid0IHVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLlxuICAgKiAgICAgUHMgPSAxIDAgMCA0ICAtPiBEb24ndCBzZW5kIEZvY3VzSW4vRm9jdXNPdXQgZXZlbnRzLlxuICAgKiAgICAgUHMgPSAxIDAgMCA1ICAtPiBEaXNhYmxlIEV4dGVuZGVkIE1vdXNlIE1vZGUuXG4gICAqICAgICBQcyA9IDEgMCAxIDAgIC0+IERvbid0IHNjcm9sbCB0byBib3R0b20gb24gdHR5IG91dHB1dFxuICAgKiAgICAgKHJ4dnQpLlxuICAgKiAgICAgUHMgPSAxIDAgMSAxICAtPiBEb24ndCBzY3JvbGwgdG8gYm90dG9tIG9uIGtleSBwcmVzcyAocnh2dCkuXG4gICAqICAgICBQcyA9IDEgMCAzIDQgIC0+IERvbid0IGludGVycHJldCBcIm1ldGFcIiBrZXkuICAoVGhpcyBkaXNhYmxlc1xuICAgKiAgICAgdGhlIGVpZ2h0Qml0SW5wdXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA1ICAtPiBEaXNhYmxlIHNwZWNpYWwgbW9kaWZpZXJzIGZvciBBbHQgYW5kIE51bS1cbiAgICogICAgIExvY2sga2V5cy4gIChUaGlzIGRpc2FibGVzIHRoZSBudW1Mb2NrIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDMgNiAgLT4gRG9uJ3Qgc2VuZCBFU0MgIHdoZW4gTWV0YSBtb2RpZmllcyBhIGtleS5cbiAgICogICAgIChUaGlzIGRpc2FibGVzIHRoZSBtZXRhU2VuZHNFc2NhcGUgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgMyA3ICAtPiBTZW5kIFZUMjIwIFJlbW92ZSBmcm9tIHRoZSBlZGl0aW5nLWtleXBhZFxuICAgKiAgICAgRGVsZXRlIGtleS5cbiAgICogICAgIFBzID0gMSAwIDMgOSAgLT4gRG9uJ3Qgc2VuZCBFU0MgIHdoZW4gQWx0IG1vZGlmaWVzIGEga2V5LlxuICAgKiAgICAgKFRoaXMgZGlzYWJsZXMgdGhlIGFsdFNlbmRzRXNjYXBlIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgMCAgLT4gRG8gbm90IGtlZXAgc2VsZWN0aW9uIHdoZW4gbm90IGhpZ2hsaWdodGVkLlxuICAgKiAgICAgKFRoaXMgZGlzYWJsZXMgdGhlIGtlZXBTZWxlY3Rpb24gcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCAxICAtPiBVc2UgdGhlIFBSSU1BUlkgc2VsZWN0aW9uLiAgKFRoaXMgZGlzYWJsZXNcbiAgICogICAgIHRoZSBzZWxlY3RUb0NsaXBib2FyZCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDIgIC0+IERpc2FibGUgVXJnZW5jeSB3aW5kb3cgbWFuYWdlciBoaW50IHdoZW5cbiAgICogICAgIENvbnRyb2wtRyBpcyByZWNlaXZlZC4gIChUaGlzIGRpc2FibGVzIHRoZSBiZWxsSXNVcmdlbnRcbiAgICogICAgIHJlc291cmNlKS5cbiAgICogICAgIFBzID0gMSAwIDQgMyAgLT4gRGlzYWJsZSByYWlzaW5nIG9mIHRoZSB3aW5kb3cgd2hlbiBDb250cm9sLVxuICAgKiAgICAgRyBpcyByZWNlaXZlZC4gIChUaGlzIGRpc2FibGVzIHRoZSBwb3BPbkJlbGwgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCA3ICAtPiBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIsIGNsZWFyaW5nIHNjcmVlblxuICAgKiAgICAgZmlyc3QgaWYgaW4gdGhlIEFsdGVybmF0ZSBTY3JlZW4uICAoVGhpcyBtYXkgYmUgZGlzYWJsZWQgYnlcbiAgICogICAgIHRoZSB0aXRlSW5oaWJpdCByZXNvdXJjZSkuXG4gICAqICAgICBQcyA9IDEgMCA0IDggIC0+IFJlc3RvcmUgY3Vyc29yIGFzIGluIERFQ1JDLiAgKFRoaXMgbWF5IGJlXG4gICAqICAgICBkaXNhYmxlZCBieSB0aGUgdGl0ZUluaGliaXQgcmVzb3VyY2UpLlxuICAgKiAgICAgUHMgPSAxIDAgNCA5ICAtPiBVc2UgTm9ybWFsIFNjcmVlbiBCdWZmZXIgYW5kIHJlc3RvcmUgY3Vyc29yXG4gICAqICAgICBhcyBpbiBERUNSQy4gIChUaGlzIG1heSBiZSBkaXNhYmxlZCBieSB0aGUgdGl0ZUluaGliaXRcbiAgICogICAgIHJlc291cmNlKS4gIFRoaXMgY29tYmluZXMgdGhlIGVmZmVjdHMgb2YgdGhlIDEgMCA0IDcgIGFuZCAxIDBcbiAgICogICAgIDQgOCAgbW9kZXMuICBVc2UgdGhpcyB3aXRoIHRlcm1pbmZvLWJhc2VkIGFwcGxpY2F0aW9ucyByYXRoZXJcbiAgICogICAgIHRoYW4gdGhlIDQgNyAgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMCAgLT4gUmVzZXQgdGVybWluZm8vdGVybWNhcCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMSAgLT4gUmVzZXQgU3VuIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNSAyICAtPiBSZXNldCBIUCBmdW5jdGlvbi1rZXkgbW9kZS5cbiAgICogICAgIFBzID0gMSAwIDUgMyAgLT4gUmVzZXQgU0NPIGZ1bmN0aW9uLWtleSBtb2RlLlxuICAgKiAgICAgUHMgPSAxIDAgNiAwICAtPiBSZXNldCBsZWdhY3kga2V5Ym9hcmQgZW11bGF0aW9uIChYMTFSNikuXG4gICAqICAgICBQcyA9IDEgMCA2IDEgIC0+IFJlc2V0IGtleWJvYXJkIGVtdWxhdGlvbiB0byBTdW4vUEMgc3R5bGUuXG4gICAqICAgICBQcyA9IDIgMCAwIDQgIC0+IFJlc2V0IGJyYWNrZXRlZCBwYXN0ZSBtb2RlLlxuICAgKlxuICAgKiBAdnQ6ICNQW1NlZSBiZWxvdyBmb3Igc3VwcG9ydGVkIG1vZGVzLl0gICAgQ1NJIERFQ1JTVCAgXCJERUMgUHJpdmF0ZSBSZXNldCBNb2RlXCIgXCJDU0kgPyBQbSBsXCIgIFwiUmVzZXQgdmFyaW91cyB0ZXJtaW5hbCBhdHRyaWJ1dGVzLlwiXG4gICAqIFN1cHBvcnRlZCBwYXJhbSB2YWx1ZXMgYnkgREVDUlNUOlxuICAgKlxuICAgKiB8IHBhcmFtIHwgQWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1cHBvcnQgfFxuICAgKiB8IC0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDEgICAgIHwgTm9ybWFsIEN1cnNvciBLZXlzIChERUNDS00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDIgICAgIHwgRGVzaWduYXRlIFZUNTIgbW9kZSAoREVDQU5NKS4gICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDMgICAgIHwgODAgQ29sdW1uIE1vZGUgKERFQ0NPTE0pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNCW1N3aXRjaGVzIHRvIG9sZCBjb2x1bW4gd2lkdGggaW5zdGVhZCBvZiA4MC5dIHxcbiAgICogfCA2ICAgICB8IE5vcm1hbCBDdXJzb3IgTW9kZSAoREVDT00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA3ICAgICB8IE5vIFdyYXBhcm91bmQgTW9kZSAoREVDQVdNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA4ICAgICB8IE5vIEF1dG8tcmVwZWF0IEtleXMgKERFQ0FSTSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCA5ICAgICB8IERvbid0IHNlbmQgTW91c2UgWCAmIFkgb24gYnV0dG9uIHByZXNzLiAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMiAgICB8IFN0b3AgQmxpbmtpbmcgQ3Vyc29yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNSAgICB8IEhpZGUgQ3Vyc29yIChERUNUQ0VNKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NSAgICB8IE5vIHJldmVyc2Ugd3JhcC1hcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NyAgICB8IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA2NiAgICB8IE51bWVyaWMga2V5cGFkIChERUNOS00pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAwICB8IERvbid0IHNlbmQgTW91c2UgcmVwb3J0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAyICB8IERvbid0IHVzZSBDZWxsIE1vdGlvbiBNb3VzZSBUcmFja2luZy4gICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDAzICB8IERvbid0IHVzZSBBbGwgTW90aW9uIE1vdXNlIFRyYWNraW5nLiAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA0ICB8IERvbid0IHNlbmQgRm9jdXNJbi9Gb2N1c091dCBldmVudHMuICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDA1ICB8IERpc2FibGUgVVRGLTggTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDA2ICB8IERpc2FibGUgU0dSIE1vdXNlIE1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDE1ICB8IERpc2FibGUgdXJ4dnQgTW91c2UgTW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjTiAgICAgIHxcbiAgICogfCAxMDE2ICB8IERpc2FibGUgU0dSLVBpeGVscyBNb3VzZSBNb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ3ICB8IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlciAoY2xlYXJpbmcgc2NyZWVuIGlmIGluIGFsdCkuICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ4ICB8IFJlc3RvcmUgY3Vyc29yIGFzIGluIERFQ1JDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAxMDQ5ICB8IFVzZSBOb3JtYWwgU2NyZWVuIEJ1ZmZlciBhbmQgcmVzdG9yZSBjdXJzb3IuICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyMDA0ICB8IFJlc2V0IGJyYWNrZXRlZCBwYXN0ZSBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IERFQ0NPTE0gaXMgY3VycmVudGx5IGJyb2tlbiAoYWxyZWFkeSBmaXhlZCBpbiB3aW5kb3cgb3B0aW9ucyBQUilcbiAgICovXG4gIHB1YmxpYyByZXNldE1vZGVQcml2YXRlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzd2l0Y2ggKHBhcmFtcy5wYXJhbXNbaV0pIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5hcHBsaWNhdGlvbkN1cnNvcktleXMgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIERFQ0NPTE0gLSA4MCBjb2x1bW4gbW9kZS5cbiAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgYWN0aXZlIGlmICdTZXRXaW5MaW5lcycgKDI0KSBpcyBlbmFibGVkXG4gICAgICAgICAgICogdGhyb3VnaCBgb3B0aW9ucy53aW5kb3dzT3B0aW9uc2AuXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucy5zZXRXaW5MaW5lcykge1xuICAgICAgICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5yZXNpemUoODAsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyk7XG4gICAgICAgICAgICB0aGlzLl9vblJlcXVlc3RSZXNldC5maXJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLm9yaWdpbiA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuX3NldEN1cnNvcigwLCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy53cmFwYXJvdW5kID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JCbGluayA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5yZXZlcnNlV3JhcGFyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1N3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuJyk7XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTogLy8gWDEwIE1vdXNlXG4gICAgICAgIGNhc2UgMTAwMDogLy8gdnQyMDAgbW91c2VcbiAgICAgICAgY2FzZSAxMDAyOiAvLyBidXR0b24gZXZlbnQgbW91c2VcbiAgICAgICAgY2FzZSAxMDAzOiAvLyBhbnkgZXZlbnQgbW91c2VcbiAgICAgICAgICB0aGlzLl9jb3JlTW91c2VTZXJ2aWNlLmFjdGl2ZVByb3RvY29sID0gJ05PTkUnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwMDQ6IC8vIHNlbmQgZm9jdXNpbi9mb2N1c291dCBldmVudHNcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMuc2VuZEZvY3VzID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwNTogLy8gdXRmOCBleHQgbW9kZSBtb3VzZSAtIHJlbW92ZWQgaW4gIzI1MDdcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdERUNSU1QgMTAwNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAwNjogLy8gc2dyIGV4dCBtb2RlIG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVFbmNvZGluZyA9ICdERUZBVUxUJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDE1OiAvLyB1cnh2dCBleHQgbW9kZSBtb3VzZSAtIHJlbW92ZWQgaW4gIzI1MDdcbiAgICAgICAgICB0aGlzLl9sb2dTZXJ2aWNlLmRlYnVnKCdERUNSU1QgMTAxNSBub3Qgc3VwcG9ydGVkIChzZWUgIzI1MDcpJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTAxNjogLy8gc2dyIHBpeGVscyBtb2RlIG1vdXNlXG4gICAgICAgICAgdGhpcy5fY29yZU1vdXNlU2VydmljZS5hY3RpdmVFbmNvZGluZyA9ICdERUZBVUxUJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTogLy8gaGlkZSBjdXJzb3JcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS5pc0N1cnNvckhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA0ODogLy8gYWx0IHNjcmVlbiBjdXJzb3JcbiAgICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3IoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMDQ5OiAvLyBhbHQgc2NyZWVuIGJ1ZmZlciBjdXJzb3JcbiAgICAgICAgLy8gRkFMTC1USFJPVUdIXG4gICAgICAgIGNhc2UgNDc6IC8vIG5vcm1hbCBzY3JlZW4gYnVmZmVyXG4gICAgICAgIGNhc2UgMTA0NzogLy8gbm9ybWFsIHNjcmVlbiBidWZmZXIgLSBjbGVhcmluZyBpdCBmaXJzdFxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgc2VsZWN0aW9uIG1hbmFnZXIgaGFzIHRoZSBjb3JyZWN0IGJ1ZmZlclxuICAgICAgICAgIHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVycy5hY3RpdmF0ZU5vcm1hbEJ1ZmZlcigpO1xuICAgICAgICAgIGlmIChwYXJhbXMucGFyYW1zW2ldID09PSAxMDQ5KSB7XG4gICAgICAgICAgICB0aGlzLnJlc3RvcmVDdXJzb3IoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5fb25SZXF1ZXN0UmVmcmVzaFJvd3MuZmlyZSgwLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxKTtcbiAgICAgICAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMDA0OiAvLyBicmFja2V0ZWQgcGFzdGUgbW9kZSAoaHR0cHM6Ly9jaXJ3LmluL2Jsb2cvYnJhY2tldGVkLXBhc3RlKVxuICAgICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2Rlcy5icmFja2V0ZWRQYXN0ZU1vZGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzICQgcCBSZXF1ZXN0IEFOU0kgTW9kZSAoREVDUlFNKS5cbiAgICpcbiAgICogUmVwb3J0cyBDU0kgUHM7IFBtICQgeSAoREVDUlBNKSwgd2hlcmUgUHMgaXMgdGhlIG1vZGUgbnVtYmVyIGFzIGluIFNNL1JNLFxuICAgKiBhbmQgUG0gaXMgdGhlIG1vZGUgdmFsdWU6XG4gICAqICAgIDAgLSBub3QgcmVjb2duaXplZFxuICAgKiAgICAxIC0gc2V0XG4gICAqICAgIDIgLSByZXNldFxuICAgKiAgICAzIC0gcGVybWFuZW50bHkgc2V0XG4gICAqICAgIDQgLSBwZXJtYW5lbnRseSByZXNldFxuICAgKlxuICAgKiBAdnQ6ICNZICBDU0kgICBERUNSUU0gIFwiUmVxdWVzdCBNb2RlXCIgIFwiQ1NJIFBzICRwXCIgIFwiUmVxdWVzdCBtb2RlIHN0YXRlLlwiXG4gICAqIFJldHVybnMgYSByZXBvcnQgYXMgYENTSSBQczsgUG0gJCB5YCAoREVDUlBNKSwgd2hlcmUgYFBzYCBpcyB0aGUgbW9kZSBudW1iZXIgYXMgaW4gU00vUk1cbiAgICogb3IgREVDU0VUL0RFQ1JTVCwgYW5kIGBQbWAgaXMgdGhlIG1vZGUgdmFsdWU6XG4gICAqIC0gMDogbm90IHJlY29nbml6ZWRcbiAgICogLSAxOiBzZXRcbiAgICogLSAyOiByZXNldFxuICAgKiAtIDM6IHBlcm1hbmVudGx5IHNldFxuICAgKiAtIDQ6IHBlcm1hbmVudGx5IHJlc2V0XG4gICAqXG4gICAqIEZvciBtb2RlcyBub3QgdW5kZXJzdG9vZCB4dGVybS5qcyBhbHdheXMgcmV0dXJucyBgbm90UmVjb2duaXplZGAuIEluIGdlbmVyYWwgdGhpcyBtZWFucyxcbiAgICogdGhhdCBhIGNlcnRhaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIGFuZCBjYW5ub3QgYmUgdXNlZC5cbiAgICpcbiAgICogTW9kZXMgY2hhbmdpbmcgdGhlIGFjdGl2ZSB0ZXJtaW5hbCBidWZmZXIgKDQ3LCAxMDQ3LCAxMDQ5KSBhcmUgbm90IHN1YnF1ZXJpZWRcbiAgICogYW5kIG9ubHkgcmVwb3J0LCB3aGV0aGVyIHRoZSBhbHRlcm5hdGUgYnVmZmVyIGlzIHNldC5cbiAgICpcbiAgICogTW91c2UgZW5jb2RpbmdzIGFuZCBtb3VzZSBwcm90b2NvbHMgYXJlIGhhbmRsZWQgbXV0dWFsIGV4Y2x1c2l2ZSxcbiAgICogdGh1cyBvbmx5IG9uZSBvZiBlYWNoIG9mIHRob3NlIGNhbiBiZSBzZXQgYXQgYSBnaXZlbiB0aW1lLlxuICAgKlxuICAgKiBUaGVyZSBpcyBhIGNoYW5jZSwgdGhhdCBzb21lIG1vZGUgcmVwb3J0cyBhcmUgbm90IGZ1bGx5IGluIGxpbmUgd2l0aCB4dGVybS5qcycgYmVoYXZpb3IsXG4gICAqIGUuZy4gaWYgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWxyZWFkeSBleHBvc2VzIGEgY2VydGFpbiBiZWhhdmlvci4gSWYgeW91IGZpbmRcbiAgICogZGlzY3JlcGFuY2llcyBpbiB0aGUgbW9kZSByZXBvcnRzLCBwbGVhc2UgZmlsZSBhIGJ1Zy5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0TW9kZShwYXJhbXM6IElQYXJhbXMsIGFuc2k6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAvLyByZXR1cm4gdmFsdWUgYXMgaW4gREVDUlBNXG4gICAgY29uc3QgZW51bSBWIHtcbiAgICAgIE5PVF9SRUNPR05JWkVEID0gMCxcbiAgICAgIFNFVCA9IDEsXG4gICAgICBSRVNFVCA9IDIsXG4gICAgICBQRVJNQU5FTlRMWV9TRVQgPSAzLFxuICAgICAgUEVSTUFORU5UTFlfUkVTRVQgPSA0XG4gICAgfVxuXG4gICAgLy8gYWNjZXNzIGhlbHBlcnNcbiAgICBjb25zdCBkbSA9IHRoaXMuX2NvcmVTZXJ2aWNlLmRlY1ByaXZhdGVNb2RlcztcbiAgICBjb25zdCB7IGFjdGl2ZVByb3RvY29sOiBtb3VzZVByb3RvY29sLCBhY3RpdmVFbmNvZGluZzogbW91c2VFbmNvZGluZyB9ID0gdGhpcy5fY29yZU1vdXNlU2VydmljZTtcbiAgICBjb25zdCBjcyA9IHRoaXMuX2NvcmVTZXJ2aWNlO1xuICAgIGNvbnN0IHsgYnVmZmVycywgY29scyB9ID0gdGhpcy5fYnVmZmVyU2VydmljZTtcbiAgICBjb25zdCB7IGFjdGl2ZSwgYWx0IH0gPSBidWZmZXJzO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zO1xuXG4gICAgY29uc3QgZiA9IChtOiBudW1iZXIsIHY6IFYpOiBib29sZWFuID0+IHtcbiAgICAgIGNzLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfVske2Fuc2kgPyAnJyA6ICc/J30ke219OyR7dn0keWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBjb25zdCBiMnYgPSAodmFsdWU6IGJvb2xlYW4pOiBWID0+IHZhbHVlID8gVi5TRVQgOiBWLlJFU0VUO1xuXG4gICAgY29uc3QgcCA9IHBhcmFtcy5wYXJhbXNbMF07XG5cbiAgICBpZiAoYW5zaSkge1xuICAgICAgaWYgKHAgPT09IDIpIHJldHVybiBmKHAsIFYuUEVSTUFORU5UTFlfUkVTRVQpO1xuICAgICAgaWYgKHAgPT09IDQpIHJldHVybiBmKHAsIGIydihjcy5tb2Rlcy5pbnNlcnRNb2RlKSk7XG4gICAgICBpZiAocCA9PT0gMTIpIHJldHVybiBmKHAsIFYuUEVSTUFORU5UTFlfU0VUKTtcbiAgICAgIGlmIChwID09PSAyMCkgcmV0dXJuIGYocCwgYjJ2KG9wdHMuY29udmVydEVvbCkpO1xuICAgICAgcmV0dXJuIGYocCwgVi5OT1RfUkVDT0dOSVpFRCk7XG4gICAgfVxuXG4gICAgaWYgKHAgPT09IDEpIHJldHVybiBmKHAsIGIydihkbS5hcHBsaWNhdGlvbkN1cnNvcktleXMpKTtcbiAgICBpZiAocCA9PT0gMykgcmV0dXJuIGYocCwgb3B0cy53aW5kb3dPcHRpb25zLnNldFdpbkxpbmVzID8gKGNvbHMgPT09IDgwID8gVi5SRVNFVCA6IGNvbHMgPT09IDEzMiA/IFYuU0VUIDogVi5OT1RfUkVDT0dOSVpFRCkgOiBWLk5PVF9SRUNPR05JWkVEKTtcbiAgICBpZiAocCA9PT0gNikgcmV0dXJuIGYocCwgYjJ2KGRtLm9yaWdpbikpO1xuICAgIGlmIChwID09PSA3KSByZXR1cm4gZihwLCBiMnYoZG0ud3JhcGFyb3VuZCkpO1xuICAgIGlmIChwID09PSA4KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1NFVCk7XG4gICAgaWYgKHAgPT09IDkpIHJldHVybiBmKHAsIGIydihtb3VzZVByb3RvY29sID09PSAnWDEwJykpO1xuICAgIGlmIChwID09PSAxMikgcmV0dXJuIGYocCwgYjJ2KG9wdHMuY3Vyc29yQmxpbmspKTtcbiAgICBpZiAocCA9PT0gMjUpIHJldHVybiBmKHAsIGIydighY3MuaXNDdXJzb3JIaWRkZW4pKTtcbiAgICBpZiAocCA9PT0gNDUpIHJldHVybiBmKHAsIGIydihkbS5yZXZlcnNlV3JhcGFyb3VuZCkpO1xuICAgIGlmIChwID09PSA2NikgcmV0dXJuIGYocCwgYjJ2KGRtLmFwcGxpY2F0aW9uS2V5cGFkKSk7XG4gICAgaWYgKHAgPT09IDY3KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1JFU0VUKTtcbiAgICBpZiAocCA9PT0gMTAwMCkgcmV0dXJuIGYocCwgYjJ2KG1vdXNlUHJvdG9jb2wgPT09ICdWVDIwMCcpKTtcbiAgICBpZiAocCA9PT0gMTAwMikgcmV0dXJuIGYocCwgYjJ2KG1vdXNlUHJvdG9jb2wgPT09ICdEUkFHJykpO1xuICAgIGlmIChwID09PSAxMDAzKSByZXR1cm4gZihwLCBiMnYobW91c2VQcm90b2NvbCA9PT0gJ0FOWScpKTtcbiAgICBpZiAocCA9PT0gMTAwNCkgcmV0dXJuIGYocCwgYjJ2KGRtLnNlbmRGb2N1cykpO1xuICAgIGlmIChwID09PSAxMDA1KSByZXR1cm4gZihwLCBWLlBFUk1BTkVOVExZX1JFU0VUKTtcbiAgICBpZiAocCA9PT0gMTAwNikgcmV0dXJuIGYocCwgYjJ2KG1vdXNlRW5jb2RpbmcgPT09ICdTR1InKSk7XG4gICAgaWYgKHAgPT09IDEwMTUpIHJldHVybiBmKHAsIFYuUEVSTUFORU5UTFlfUkVTRVQpO1xuICAgIGlmIChwID09PSAxMDE2KSByZXR1cm4gZihwLCBiMnYobW91c2VFbmNvZGluZyA9PT0gJ1NHUl9QSVhFTFMnKSk7XG4gICAgaWYgKHAgPT09IDEwNDgpIHJldHVybiBmKHAsIFYuU0VUKTsgLy8geHRlcm0gYWx3YXlzIHJldHVybnMgU0VUIGhlcmVcbiAgICBpZiAocCA9PT0gNDcgfHwgcCA9PT0gMTA0NyB8fCBwID09PSAxMDQ5KSByZXR1cm4gZihwLCBiMnYoYWN0aXZlID09PSBhbHQpKTtcbiAgICBpZiAocCA9PT0gMjAwNCkgcmV0dXJuIGYocCwgYjJ2KGRtLmJyYWNrZXRlZFBhc3RlTW9kZSkpO1xuICAgIHJldHVybiBmKHAsIFYuTk9UX1JFQ09HTklaRUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byB3cml0ZSBjb2xvciBpbmZvcm1hdGlvbiBwYWNrZWQgd2l0aCBjb2xvciBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlQXR0ckNvbG9yKGNvbG9yOiBudW1iZXIsIG1vZGU6IG51bWJlciwgYzE6IG51bWJlciwgYzI6IG51bWJlciwgYzM6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKG1vZGUgPT09IDIpIHtcbiAgICAgIGNvbG9yIHw9IEF0dHJpYnV0ZXMuQ01fUkdCO1xuICAgICAgY29sb3IgJj0gfkF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBjb2xvciB8PSBBdHRyaWJ1dGVEYXRhLmZyb21Db2xvclJHQihbYzEsIGMyLCBjM10pO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gNSkge1xuICAgICAgY29sb3IgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgIGNvbG9yIHw9IEF0dHJpYnV0ZXMuQ01fUDI1NiB8IChjMSAmIDB4ZmYpO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGV4dHJhY3QgYW5kIGFwcGx5IGNvbG9yIHBhcmFtcy9zdWJwYXJhbXMuXG4gICAqIFJldHVybnMgYWR2YW5jZSBmb3IgcGFyYW1zIGluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdENvbG9yKHBhcmFtczogSVBhcmFtcywgcG9zOiBudW1iZXIsIGF0dHI6IElBdHRyaWJ1dGVEYXRhKTogbnVtYmVyIHtcbiAgICAvLyBub3JtYWxpemUgcGFyYW1zXG4gICAgLy8gbWVhbmluZzogW3RhcmdldCwgQ00sIGlnbiwgdmFsLCB2YWwsIHZhbF1cbiAgICAvLyBSR0IgICAgOiBbIDM4LzQ4LCAgMiwgaWduLCAgIHIsICAgZywgICBiXVxuICAgIC8vIFAyNTYgICA6IFsgMzgvNDgsICA1LCBpZ24sICAgdiwgaWduLCBpZ25dXG4gICAgY29uc3QgYWNjdSA9IFswLCAwLCAtMSwgMCwgMCwgMF07XG5cbiAgICAvLyBhbGlnbm1lbnQgcGxhY2Vob2xkZXIgZm9yIG5vbiBjb2xvciBzcGFjZSBzZXF1ZW5jZXNcbiAgICBsZXQgY1NwYWNlID0gMDtcblxuICAgIC8vIHJldHVybiBhZHZhbmNlIHdlIHRvb2sgaW4gcGFyYW1zXG4gICAgbGV0IGFkdmFuY2UgPSAwO1xuXG4gICAgZG8ge1xuICAgICAgYWNjdVthZHZhbmNlICsgY1NwYWNlXSA9IHBhcmFtcy5wYXJhbXNbcG9zICsgYWR2YW5jZV07XG4gICAgICBpZiAocGFyYW1zLmhhc1N1YlBhcmFtcyhwb3MgKyBhZHZhbmNlKSkge1xuICAgICAgICBjb25zdCBzdWJwYXJhbXMgPSBwYXJhbXMuZ2V0U3ViUGFyYW1zKHBvcyArIGFkdmFuY2UpITtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKGFjY3VbMV0gPT09IDUpIHtcbiAgICAgICAgICAgIGNTcGFjZSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjY3VbYWR2YW5jZSArIGkgKyAxICsgY1NwYWNlXSA9IHN1YnBhcmFtc1tpXTtcbiAgICAgICAgfSB3aGlsZSAoKytpIDwgc3VicGFyYW1zLmxlbmd0aCAmJiBpICsgYWR2YW5jZSArIDEgKyBjU3BhY2UgPCBhY2N1Lmxlbmd0aCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gZXhpdCBlYXJseSBpZiBjYW4gZGVjaWRlIGNvbG9yIG1vZGUgd2l0aCBzZW1pY29sb25zXG4gICAgICBpZiAoKGFjY3VbMV0gPT09IDUgJiYgYWR2YW5jZSArIGNTcGFjZSA+PSAyKVxuICAgICAgICB8fCAoYWNjdVsxXSA9PT0gMiAmJiBhZHZhbmNlICsgY1NwYWNlID49IDUpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gb2Zmc2V0IGNvbG9yU3BhY2Ugc2xvdCBmb3Igc2VtaWNvbG9uIG1vZGVcbiAgICAgIGlmIChhY2N1WzFdKSB7XG4gICAgICAgIGNTcGFjZSA9IDE7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoKythZHZhbmNlICsgcG9zIDwgcGFyYW1zLmxlbmd0aCAmJiBhZHZhbmNlICsgY1NwYWNlIDwgYWNjdS5sZW5ndGgpO1xuXG4gICAgLy8gc2V0IGRlZmF1bHQgdmFsdWVzIHRvIDBcbiAgICBmb3IgKGxldCBpID0gMjsgaSA8IGFjY3UubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChhY2N1W2ldID09PSAtMSkge1xuICAgICAgICBhY2N1W2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBhcHBseSBjb2xvcnNcbiAgICBzd2l0Y2ggKGFjY3VbMF0pIHtcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIGF0dHIuZmcgPSB0aGlzLl91cGRhdGVBdHRyQ29sb3IoYXR0ci5mZywgYWNjdVsxXSwgYWNjdVszXSwgYWNjdVs0XSwgYWNjdVs1XSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0ODpcbiAgICAgICAgYXR0ci5iZyA9IHRoaXMuX3VwZGF0ZUF0dHJDb2xvcihhdHRyLmJnLCBhY2N1WzFdLCBhY2N1WzNdLCBhY2N1WzRdLCBhY2N1WzVdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU4OlxuICAgICAgICBhdHRyLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZC5jbG9uZSgpO1xuICAgICAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yID0gdGhpcy5fdXBkYXRlQXR0ckNvbG9yKGF0dHIuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IsIGFjY3VbMV0sIGFjY3VbM10sIGFjY3VbNF0sIGFjY3VbNV0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZHZhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNHUiA0IHN1YnBhcmFtczpcbiAgICogICAgNDowICAgLSAgIGVxdWFsIHRvIFNHUiAyNCAodHVybiBvZmYgYWxsIHVuZGVybGluZSlcbiAgICogICAgNDoxICAgLSAgIGVxdWFsIHRvIFNHUiA0IChzaW5nbGUgdW5kZXJsaW5lKVxuICAgKiAgICA0OjIgICAtICAgZXF1YWwgdG8gU0dSIDIxIChkb3VibGUgdW5kZXJsaW5lKVxuICAgKiAgICA0OjMgICAtICAgY3VybHkgdW5kZXJsaW5lXG4gICAqICAgIDQ6NCAgIC0gICBkb3R0ZWQgdW5kZXJsaW5lXG4gICAqICAgIDQ6NSAgIC0gICBkYXNoZWQgdW5kZXJsaW5lXG4gICAqL1xuICBwcml2YXRlIF9wcm9jZXNzVW5kZXJsaW5lKHN0eWxlOiBudW1iZXIsIGF0dHI6IElBdHRyaWJ1dGVEYXRhKTogdm9pZCB7XG4gICAgLy8gdHJlYXQgZXh0ZW5kZWQgYXR0cnMgYXMgaW1tdXRhYmxlLCB0aHVzIGFsd2F5cyBjbG9uZSBmcm9tIG9sZCBvbmVcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCBzaW5jZSB0aGUgYnVmZmVyIG9ubHkgaG9sZHMgcmVmZXJlbmNlcyB0byBpdFxuICAgIGF0dHIuZXh0ZW5kZWQgPSBhdHRyLmV4dGVuZGVkLmNsb25lKCk7XG5cbiAgICAvLyBkZWZhdWx0IHRvIDEgPT0gc2luZ2xlIHVuZGVybGluZVxuICAgIGlmICghfnN0eWxlIHx8IHN0eWxlID4gNSkge1xuICAgICAgc3R5bGUgPSAxO1xuICAgIH1cbiAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlID0gc3R5bGU7XG4gICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLlVOREVSTElORTtcblxuICAgIC8vIDAgZGVhY3RpdmF0ZXMgdW5kZXJsaW5lXG4gICAgaWYgKHN0eWxlID09PSAwKSB7XG4gICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLlVOREVSTElORTtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgSEFTX0VYVEVOREVEIGluIEJHXG4gICAgYXR0ci51cGRhdGVFeHRlbmRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc1NHUjAoYXR0cjogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBhdHRyLmZnID0gREVGQVVMVF9BVFRSX0RBVEEuZmc7XG4gICAgYXR0ci5iZyA9IERFRkFVTFRfQVRUUl9EQVRBLmJnO1xuICAgIGF0dHIuZXh0ZW5kZWQgPSBhdHRyLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgLy8gUmVzZXQgdW5kZXJsaW5lIHN0eWxlIGFuZCBjb2xvci4gTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgb3RoZXJcbiAgICAvLyBmaWVsZHMgc3VjaCBhcyB0aGUgdXJsIGlkLlxuICAgIGF0dHIuZXh0ZW5kZWQudW5kZXJsaW5lU3R5bGUgPSBVbmRlcmxpbmVTdHlsZS5OT05FO1xuICAgIGF0dHIuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICBhdHRyLnVwZGF0ZUV4dGVuZGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBtIG0gIENoYXJhY3RlciBBdHRyaWJ1dGVzIChTR1IpLlxuICAgKlxuICAgKiBAdnQ6ICNQW1NlZSBiZWxvdyBmb3Igc3VwcG9ydGVkIGF0dHJpYnV0ZXMuXSAgICBDU0kgU0dSICAgXCJTZWxlY3QgR3JhcGhpYyBSZW5kaXRpb25cIiAgXCJDU0kgUG0gbVwiICBcIlNldC9SZXNldCB2YXJpb3VzIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKiBTR1Igc2VsZWN0cyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXIgYXR0cmlidXRlcyBhdCB0aGUgc2FtZSB0aW1lLiBNdWx0aXBsZSBwYXJhbXMgKHVwIHRvIDMyKVxuICAgKiBhcmUgYXBwbGllZCBpbiBvcmRlciBmcm9tIGxlZnQgdG8gcmlnaHQuIFRoZSBjaGFuZ2VkIGF0dHJpYnV0ZXMgYXJlIGFwcGxpZWQgdG8gYWxsIG5ld1xuICAgKiBjaGFyYWN0ZXJzIHJlY2VpdmVkLiBJZiB5b3UgbW92ZSBjaGFyYWN0ZXJzIGluIHRoZSB2aWV3cG9ydCBieSBzY3JvbGxpbmcgb3IgYW55IG90aGVyIG1lYW5zLFxuICAgKiB0aGVuIHRoZSBhdHRyaWJ1dGVzIG1vdmUgd2l0aCB0aGUgY2hhcmFjdGVycy5cbiAgICpcbiAgICogU3VwcG9ydGVkIHBhcmFtIHZhbHVlcyBieSBTR1I6XG4gICAqXG4gICAqIHwgUGFyYW0gICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0gfFxuICAgKiB8IDAgICAgICAgICB8IE5vcm1hbCAoZGVmYXVsdCkuIFJlc2V0cyBhbnkgb3RoZXIgcHJlY2VkaW5nIFNHUi4gICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMSAgICAgICAgIHwgQm9sZC4gKGFsc28gc2VlIGBvcHRpb25zLmRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzYCkgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICAgICAgfCBGYWludCwgZGVjcmVhc2VkIGludGVuc2l0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMgICAgICAgICB8IEl0YWxpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNCAgICAgICAgIHwgVW5kZXJsaW5lZCAoc2VlIGJlbG93IGZvciBzdHlsZSBzdXBwb3J0KS4gICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1ICAgICAgICAgfCBTbG93bHkgYmxpbmtpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDYgICAgICAgICB8IFJhcGlkbHkgYmxpbmtpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgNyAgICAgICAgIHwgSW52ZXJzZS4gRmxpcHMgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvci4gICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA4ICAgICAgICAgfCBJbnZpc2libGUgKGhpZGRlbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDkgICAgICAgICB8IENyb3NzZWQtb3V0IGNoYXJhY3RlcnMgKHN0cmlrZXRocm91Z2gpLiAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjEgICAgICAgIHwgRG91Ymx5IHVuZGVybGluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyMiAgICAgICAgfCBOb3JtYWwgKG5laXRoZXIgYm9sZCBub3IgZmFpbnQpLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDIzICAgICAgICB8IE5vIGl0YWxpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjQgICAgICAgIHwgTm90IHVuZGVybGluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyNSAgICAgICAgfCBTdGVhZHkgKG5vdCBibGlua2luZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDI3ICAgICAgICB8IFBvc2l0aXZlIChub3QgaW52ZXJzZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMjggICAgICAgIHwgVmlzaWJsZSAobm90IGhpZGRlbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyOSAgICAgICAgfCBOb3QgQ3Jvc3NlZC1vdXQgKHN0cmlrZXRocm91Z2gpLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMwICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IEJsYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzEgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogUmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzMiAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBHcmVlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDMzICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IFllbGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzQgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogQmx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzNSAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBNYWdlbnRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDM2ICAgICAgICB8IEZvcmVncm91bmQgY29sb3I6IEN5YW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMzcgICAgICAgIHwgRm9yZWdyb3VuZCBjb2xvcjogV2hpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAzOCAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBFeHRlbmRlZCBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICB8ICNQW1N1cHBvcnQgZm9yIFJHQiBhbmQgaW5kZXhlZCBjb2xvcnMsIHNlZSBiZWxvdy5dIHxcbiAgICogfCAzOSAgICAgICAgfCBGb3JlZ3JvdW5kIGNvbG9yOiBEZWZhdWx0IChvcmlnaW5hbCkuICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQwICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IEJsYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDEgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogUmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0MiAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBHcmVlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQzICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IFllbGxvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDQgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogQmx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0NSAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBNYWdlbnRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQ2ICAgICAgICB8IEJhY2tncm91bmQgY29sb3I6IEN5YW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNDcgICAgICAgIHwgQmFja2dyb3VuZCBjb2xvcjogV2hpdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA0OCAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBFeHRlbmRlZCBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICB8ICNQW1N1cHBvcnQgZm9yIFJHQiBhbmQgaW5kZXhlZCBjb2xvcnMsIHNlZSBiZWxvdy5dIHxcbiAgICogfCA0OSAgICAgICAgfCBCYWNrZ3JvdW5kIGNvbG9yOiBEZWZhdWx0IChvcmlnaW5hbCkuICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDUzICAgICAgICB8IE92ZXJsaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgNTUgICAgICAgIHwgTm90IE92ZXJsaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1OCAgICAgICAgfCBVbmRlcmxpbmUgY29sb3I6IEV4dGVuZGVkIGNvbG9yLiAgICAgICAgICAgICAgICAgICAgICAgICB8ICNQW1N1cHBvcnQgZm9yIFJHQiBhbmQgaW5kZXhlZCBjb2xvcnMsIHNlZSBiZWxvdy5dIHxcbiAgICogfCA5MCAtIDk3ICAgfCBCcmlnaHQgZm9yZWdyb3VuZCBjb2xvciAoYW5hbG9nb3VzIHRvIDMwIC0gMzcpLiAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDEwMCAtIDEwNyB8IEJyaWdodCBiYWNrZ3JvdW5kIGNvbG9yIChhbmFsb2dvdXMgdG8gNDAgLSA0NykuICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqXG4gICAqIFVuZGVybGluZSBzdXBwb3J0cyBzdWJwYXJhbXMgdG8gZGVub3RlIHRoZSBzdHlsZSBpbiB0aGUgZm9ybSBgNCA6IHhgOlxuICAgKlxuICAgKiB8IHggICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTdXBwb3J0IHxcbiAgICogfCAtLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8XG4gICAqIHwgMCAgICAgIHwgTm8gdW5kZXJsaW5lLiBTYW1lIGFzIGBTR1IgMjQgbWAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDEgICAgICB8IFNpbmdsZSB1bmRlcmxpbmUuIFNhbWUgYXMgYFNHUiA0IG1gLiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCAyICAgICAgfCBEb3VibGUgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgMyAgICAgIHwgQ3VybHkgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKiB8IDQgICAgICB8IERvdHRlZCB1bmRlcmxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjWSAgICAgIHxcbiAgICogfCA1ICAgICAgfCBEYXNoZWQgdW5kZXJsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI1kgICAgICB8XG4gICAqIHwgb3RoZXIgIHwgU2luZ2xlIHVuZGVybGluZS4gU2FtZSBhcyBgU0dSIDQgbWAuICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNZICAgICAgfFxuICAgKlxuICAgKiBFeHRlbmRlZCBjb2xvcnMgYXJlIHN1cHBvcnRlZCBmb3IgZm9yZWdyb3VuZCAoUHM9MzgpLCBiYWNrZ3JvdW5kIChQcz00OCkgYW5kIHVuZGVybGluZSAoUHM9NTgpXG4gICAqIGFzIGZvbGxvd3M6XG4gICAqXG4gICAqIHwgUHMgKyAxIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN1cHBvcnQgfFxuICAgKiB8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHxcbiAgICogfCAwICAgICAgfCBJbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgMSAgICAgIHwgVHJhbnNwYXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDIgICAgICB8IFJHQiBjb2xvciBhcyBgUHMgOyAyIDsgUiA7IEcgOyBCYCBvciBgUHMgOiAyIDogOiBSIDogRyA6IEJgLiAgfCAjWSAgICAgIHxcbiAgICogfCAzICAgICAgfCBDTVkgY29sb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI04gICAgICB8XG4gICAqIHwgNCAgICAgIHwgQ01ZSyBjb2xvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNOICAgICAgfFxuICAgKiB8IDUgICAgICB8IEluZGV4ZWQgKDI1NiBjb2xvcnMpIGFzIGBQcyA7IDUgOyBJTkRFWGAgb3IgYFBzIDogNSA6IElOREVYYC4gfCAjWSAgICAgIHxcbiAgICpcbiAgICpcbiAgICogRklYTUU6IGJsaW5raW5nIGlzIGltcGxlbWVudGVkIGluIGF0dHJzLCBidXQgbm90IHdvcmtpbmcgaW4gcmVuZGVyZXJzP1xuICAgKiBGSVhNRTogcmVtb3ZlIGRlYWQgYnJhbmNoIGZvciBwPTEwMFxuICAgKi9cbiAgcHVibGljIGNoYXJBdHRyaWJ1dGVzKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIC8vIE9wdGltaXplIGEgc2luZ2xlIFNHUjAuXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDEgJiYgcGFyYW1zLnBhcmFtc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5fcHJvY2Vzc1NHUjAodGhpcy5fY3VyQXR0ckRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbCA9IHBhcmFtcy5sZW5ndGg7XG4gICAgbGV0IHA7XG4gICAgY29uc3QgYXR0ciA9IHRoaXMuX2N1ckF0dHJEYXRhO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICAgIHAgPSBwYXJhbXMucGFyYW1zW2ldO1xuICAgICAgaWYgKHAgPj0gMzAgJiYgcCA8PSAzNykge1xuICAgICAgICAvLyBmZyBjb2xvciA4XG4gICAgICAgIGF0dHIuZmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgICAgYXR0ci5mZyB8PSBBdHRyaWJ1dGVzLkNNX1AxNiB8IChwIC0gMzApO1xuICAgICAgfSBlbHNlIGlmIChwID49IDQwICYmIHAgPD0gNDcpIHtcbiAgICAgICAgLy8gYmcgY29sb3IgOFxuICAgICAgICBhdHRyLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5QQ09MT1JfTUFTSyk7XG4gICAgICAgIGF0dHIuYmcgfD0gQXR0cmlidXRlcy5DTV9QMTYgfCAocCAtIDQwKTtcbiAgICAgIH0gZWxzZSBpZiAocCA+PSA5MCAmJiBwIDw9IDk3KSB7XG4gICAgICAgIC8vIGZnIGNvbG9yIDE2XG4gICAgICAgIGF0dHIuZmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLKTtcbiAgICAgICAgYXR0ci5mZyB8PSBBdHRyaWJ1dGVzLkNNX1AxNiB8IChwIC0gOTApIHwgODtcbiAgICAgIH0gZWxzZSBpZiAocCA+PSAxMDAgJiYgcCA8PSAxMDcpIHtcbiAgICAgICAgLy8gYmcgY29sb3IgMTZcbiAgICAgICAgYXR0ci5iZyAmPSB+KEF0dHJpYnV0ZXMuQ01fTUFTSyB8IEF0dHJpYnV0ZXMuUENPTE9SX01BU0spO1xuICAgICAgICBhdHRyLmJnIHw9IEF0dHJpYnV0ZXMuQ01fUDE2IHwgKHAgLSAxMDApIHwgODtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMCkge1xuICAgICAgICAvLyBkZWZhdWx0XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NTR1IwKGF0dHIpO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAxKSB7XG4gICAgICAgIC8vIGJvbGQgdGV4dFxuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuQk9MRDtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMykge1xuICAgICAgICAvLyBpdGFsaWMgdGV4dFxuICAgICAgICBhdHRyLmJnIHw9IEJnRmxhZ3MuSVRBTElDO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA0KSB7XG4gICAgICAgIC8vIHVuZGVybGluZWQgdGV4dFxuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuVU5ERVJMSU5FO1xuICAgICAgICB0aGlzLl9wcm9jZXNzVW5kZXJsaW5lKHBhcmFtcy5oYXNTdWJQYXJhbXMoaSkgPyBwYXJhbXMuZ2V0U3ViUGFyYW1zKGkpIVswXSA6IFVuZGVybGluZVN0eWxlLlNJTkdMRSwgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDUpIHtcbiAgICAgICAgLy8gYmxpbmtcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLkJMSU5LO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA3KSB7XG4gICAgICAgIC8vIGludmVyc2UgYW5kIHBvc2l0aXZlXG4gICAgICAgIC8vIHRlc3Qgd2l0aDogZWNobyAtZSAnXFxlWzMxbVxcZVs0Mm1oZWxsb1xcZVs3bXdvcmxkXFxlWzI3bWhpXFxlW20nXG4gICAgICAgIGF0dHIuZmcgfD0gRmdGbGFncy5JTlZFUlNFO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA4KSB7XG4gICAgICAgIC8vIGludmlzaWJsZVxuICAgICAgICBhdHRyLmZnIHw9IEZnRmxhZ3MuSU5WSVNJQkxFO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA5KSB7XG4gICAgICAgIC8vIHN0cmlrZXRocm91Z2hcbiAgICAgICAgYXR0ci5mZyB8PSBGZ0ZsYWdzLlNUUklLRVRIUk9VR0g7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDIpIHtcbiAgICAgICAgLy8gZGltbWVkIHRleHRcbiAgICAgICAgYXR0ci5iZyB8PSBCZ0ZsYWdzLkRJTTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjEpIHtcbiAgICAgICAgLy8gZG91YmxlIHVuZGVybGluZVxuICAgICAgICB0aGlzLl9wcm9jZXNzVW5kZXJsaW5lKFVuZGVybGluZVN0eWxlLkRPVUJMRSwgYXR0cik7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDIyKSB7XG4gICAgICAgIC8vIG5vdCBib2xkIG5vciBmYWludFxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLkJPTEQ7XG4gICAgICAgIGF0dHIuYmcgJj0gfkJnRmxhZ3MuRElNO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyMykge1xuICAgICAgICAvLyBub3QgaXRhbGljXG4gICAgICAgIGF0dHIuYmcgJj0gfkJnRmxhZ3MuSVRBTElDO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAyNCkge1xuICAgICAgICAvLyBub3QgdW5kZXJsaW5lZFxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLlVOREVSTElORTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc1VuZGVybGluZShVbmRlcmxpbmVTdHlsZS5OT05FLCBhdHRyKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjUpIHtcbiAgICAgICAgLy8gbm90IGJsaW5rXG4gICAgICAgIGF0dHIuZmcgJj0gfkZnRmxhZ3MuQkxJTks7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDI3KSB7XG4gICAgICAgIC8vIG5vdCBpbnZlcnNlXG4gICAgICAgIGF0dHIuZmcgJj0gfkZnRmxhZ3MuSU5WRVJTRTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjgpIHtcbiAgICAgICAgLy8gbm90IGludmlzaWJsZVxuICAgICAgICBhdHRyLmZnICY9IH5GZ0ZsYWdzLklOVklTSUJMRTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMjkpIHtcbiAgICAgICAgLy8gbm90IHN0cmlrZXRocm91Z2hcbiAgICAgICAgYXR0ci5mZyAmPSB+RmdGbGFncy5TVFJJS0VUSFJPVUdIO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAzOSkge1xuICAgICAgICAvLyByZXNldCBmZ1xuICAgICAgICBhdHRyLmZnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuZmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuZmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA0OSkge1xuICAgICAgICAvLyByZXNldCBiZ1xuICAgICAgICBhdHRyLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuYmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuYmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgfSBlbHNlIGlmIChwID09PSAzOCB8fCBwID09PSA0OCB8fCBwID09PSA1OCkge1xuICAgICAgICAvLyBmZyBjb2xvciAyNTYgYW5kIFJHQlxuICAgICAgICBpICs9IHRoaXMuX2V4dHJhY3RDb2xvcihwYXJhbXMsIGksIGF0dHIpO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA1Mykge1xuICAgICAgICAvLyBvdmVybGluZVxuICAgICAgICBhdHRyLmJnIHw9IEJnRmxhZ3MuT1ZFUkxJTkU7XG4gICAgICB9IGVsc2UgaWYgKHAgPT09IDU1KSB7XG4gICAgICAgIC8vIG5vdCBvdmVybGluZVxuICAgICAgICBhdHRyLmJnICY9IH5CZ0ZsYWdzLk9WRVJMSU5FO1xuICAgICAgfSBlbHNlIGlmIChwID09PSA1OSkge1xuICAgICAgICBhdHRyLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZC5jbG9uZSgpO1xuICAgICAgICBhdHRyLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yID0gLTE7XG4gICAgICAgIGF0dHIudXBkYXRlRXh0ZW5kZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAocCA9PT0gMTAwKSB7IC8vIEZJWE1FOiBkZWFkIGJyYW5jaCwgcD0xMDAgYWxyZWFkeSBoYW5kbGVkIGFib3ZlIVxuICAgICAgICAvLyByZXNldCBmZy9iZ1xuICAgICAgICBhdHRyLmZnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuZmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuZmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgICBhdHRyLmJnICY9IH4oQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gICAgICAgIGF0dHIuYmcgfD0gREVGQVVMVF9BVFRSX0RBVEEuYmcgJiAoQXR0cmlidXRlcy5QQ09MT1JfTUFTSyB8IEF0dHJpYnV0ZXMuUkdCX01BU0spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1ZygnVW5rbm93biBTR1IgYXR0cmlidXRlOiAlZC4nLCBwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIG4gIERldmljZSBTdGF0dXMgUmVwb3J0IChEU1IpLlxuICAgKiAgICAgUHMgPSA1ICAtPiBTdGF0dXMgUmVwb3J0LiAgUmVzdWx0IChgYE9LJycpIGlzXG4gICAqICAgQ1NJIDAgblxuICAgKiAgICAgUHMgPSA2ICAtPiBSZXBvcnQgQ3Vyc29yIFBvc2l0aW9uIChDUFIpIFtyb3c7Y29sdW1uXS5cbiAgICogICBSZXN1bHQgaXNcbiAgICogICBDU0kgciA7IGMgUlxuICAgKiBDU0kgPyBQcyBuXG4gICAqICAgRGV2aWNlIFN0YXR1cyBSZXBvcnQgKERTUiwgREVDLXNwZWNpZmljKS5cbiAgICogICAgIFBzID0gNiAgLT4gUmVwb3J0IEN1cnNvciBQb3NpdGlvbiAoQ1BSKSBbcm93O2NvbHVtbl0gYXMgQ1NJXG4gICAqICAgICA/IHIgOyBjIFIgKGFzc3VtZXMgcGFnZSBpcyB6ZXJvKS5cbiAgICogICAgIFBzID0gMSA1ICAtPiBSZXBvcnQgUHJpbnRlciBzdGF0dXMgYXMgQ1NJID8gMSAwICBuICAocmVhZHkpLlxuICAgKiAgICAgb3IgQ1NJID8gMSAxICBuICAobm90IHJlYWR5KS5cbiAgICogICAgIFBzID0gMiA1ICAtPiBSZXBvcnQgVURLIHN0YXR1cyBhcyBDU0kgPyAyIDAgIG4gICh1bmxvY2tlZClcbiAgICogICAgIG9yIENTSSA/IDIgMSAgbiAgKGxvY2tlZCkuXG4gICAqICAgICBQcyA9IDIgNiAgLT4gUmVwb3J0IEtleWJvYXJkIHN0YXR1cyBhc1xuICAgKiAgIENTSSA/IDIgNyAgOyAgMSAgOyAgMCAgOyAgMCAgbiAgKE5vcnRoIEFtZXJpY2FuKS5cbiAgICogICBUaGUgbGFzdCB0d28gcGFyYW1ldGVycyBhcHBseSB0byBWVDQwMCAmIHVwLCBhbmQgZGVub3RlIGtleS1cbiAgICogICBib2FyZCByZWFkeSBhbmQgTEswMSByZXNwZWN0aXZlbHkuXG4gICAqICAgICBQcyA9IDUgMyAgLT4gUmVwb3J0IExvY2F0b3Igc3RhdHVzIGFzXG4gICAqICAgQ1NJID8gNSAzICBuICBMb2NhdG9yIGF2YWlsYWJsZSwgaWYgY29tcGlsZWQtaW4sIG9yXG4gICAqICAgQ1NJID8gNSAwICBuICBObyBMb2NhdG9yLCBpZiBub3QuXG4gICAqXG4gICAqIEB2dDogI1kgQ1NJIERTUiAgIFwiRGV2aWNlIFN0YXR1cyBSZXBvcnRcIiAgXCJDU0kgUHMgblwiICBcIlJlcXVlc3QgY3Vyc29yIHBvc2l0aW9uIChDUFIpIHdpdGggYFBzYCA9IDYuXCJcbiAgICovXG4gIHB1YmxpYyBkZXZpY2VTdGF0dXMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChwYXJhbXMucGFyYW1zWzBdKSB7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIC8vIHN0YXR1cyByZXBvcnRcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9WzBuYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA2OlxuICAgICAgICAvLyBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgMTtcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9WyR7eX07JHt4fVJgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQHZ0OiAjUFtPbmx5IENQUiBpcyBzdXBwb3J0ZWQuXSAgQ1NJIERFQ0RTUiAgXCJERUMgRGV2aWNlIFN0YXR1cyBSZXBvcnRcIiAgXCJDU0kgPyBQcyBuXCIgIFwiT25seSBDUFIgaXMgc3VwcG9ydGVkIChzYW1lIGFzIERTUikuXCJcbiAgcHVibGljIGRldmljZVN0YXR1c1ByaXZhdGUocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgLy8gbW9kZXJuIHh0ZXJtIGRvZXNudCBzZWVtIHRvXG4gICAgLy8gcmVzcG9uZCB0byBhbnkgb2YgdGhlc2UgZXhjZXB0ID82LCA2LCBhbmQgNVxuICAgIHN3aXRjaCAocGFyYW1zLnBhcmFtc1swXSkge1xuICAgICAgY2FzZSA2OlxuICAgICAgICAvLyBjdXJzb3IgcG9zaXRpb25cbiAgICAgICAgY29uc3QgeSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgMTtcbiAgICAgICAgY29uc3QgeCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci54ICsgMTtcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChgJHtDMC5FU0N9Wz8ke3l9OyR7eH1SYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNTpcbiAgICAgICAgLy8gbm8gcHJpbnRlclxuICAgICAgICAvLyB0aGlzLmhhbmRsZXIoQzAuRVNDICsgJ1s/MTFuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyNTpcbiAgICAgICAgLy8gZG9udCBzdXBwb3J0IHVzZXIgZGVmaW5lZCBrZXlzXG4gICAgICAgIC8vIHRoaXMuaGFuZGxlcihDMC5FU0MgKyAnWz8yMW4nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI2OlxuICAgICAgICAvLyBub3J0aCBhbWVyaWNhbiBrZXlib2FyZFxuICAgICAgICAvLyB0aGlzLmhhbmRsZXIoQzAuRVNDICsgJ1s/Mjc7MTswOzBuJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1MzpcbiAgICAgICAgLy8gbm8gZGVjIGxvY2F0b3IvbW91c2VcbiAgICAgICAgLy8gdGhpcy5oYW5kbGVyKEMwLkVTQyArICdbPzUwbicpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJICEgcCAgIFNvZnQgdGVybWluYWwgcmVzZXQgKERFQ1NUUikuXG4gICAqIGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTQtMTAuaHRtbFxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNTVFIgIFwiU29mdCBUZXJtaW5hbCBSZXNldFwiICAgXCJDU0kgISBwXCIgICBcIlJlc2V0IHNldmVyYWwgdGVybWluYWwgYXR0cmlidXRlcyB0byBpbml0aWFsIHN0YXRlLlwiXG4gICAqIFRoZXJlIGFyZSB0d28gdGVybWluYWwgcmVzZXQgc2VxdWVuY2VzIC0gUklTIGFuZCBERUNTVFIuIFdoaWxlIFJJUyBwZXJmb3JtcyBhbG1vc3QgYSBmdWxsXG4gICAqIHRlcm1pbmFsIGJvb3RzdHJhcCwgREVDU1RSIG9ubHkgcmVzZXRzIGNlcnRhaW4gYXR0cmlidXRlcy4gRm9yIG1vc3QgbmVlZHMgREVDU1RSIHNob3VsZCBiZVxuICAgKiBzdWZmaWNpZW50LlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIHRlcm1pbmFsIGF0dHJpYnV0ZXMgYXJlIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzOlxuICAgKiAtIElSTSBpcyByZXNldCAoZGFmYXVsdCA9IGZhbHNlKVxuICAgKiAtIHNjcm9sbCBtYXJnaW5zIGFyZSByZXNldCAoZGVmYXVsdCA9IHZpZXdwb3J0IHNpemUpXG4gICAqIC0gZXJhc2UgYXR0cmlidXRlcyBhcmUgcmVzZXQgdG8gZGVmYXVsdFxuICAgKiAtIGNoYXJzZXRzIGFyZSByZXNldFxuICAgKiAtIERFQ1NDIGRhdGEgaXMgcmVzZXQgdG8gaW5pdGlhbCB2YWx1ZXNcbiAgICogLSBERUNPTSBpcyByZXNldCB0byBhYnNvbHV0ZSBtb2RlXG4gICAqXG4gICAqXG4gICAqIEZJWE1FOiB0aGVyZSBhcmUgc2V2ZXJhbCBtb3JlIGF0dHJpYnV0ZXMgbWlzc2luZyAoc2VlIFZUNTIwIG1hbnVhbClcbiAgICovXG4gIHB1YmxpYyBzb2Z0UmVzZXQocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UuaXNDdXJzb3JIaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsQm90dG9tID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIC0gMTtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UucmVzZXQoKTtcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5yZXNldCgpO1xuXG4gICAgLy8gcmVzZXQgREVDU0MgZGF0YVxuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFggPSAwO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZFkgPSB0aGlzLl9hY3RpdmVCdWZmZXIueWJhc2U7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuZmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5mZztcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5iZyA9IHRoaXMuX2N1ckF0dHJEYXRhLmJnO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZENoYXJzZXQgPSB0aGlzLl9jaGFyc2V0U2VydmljZS5jaGFyc2V0O1xuXG4gICAgLy8gcmVzZXQgREVDT01cbiAgICB0aGlzLl9jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXMub3JpZ2luID0gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ1NJIFBzIFNQIHEgIFNldCBjdXJzb3Igc3R5bGUgKERFQ1NDVVNSLCBWVDUyMCkuXG4gICAqICAgUHMgPSAwICAtPiBibGlua2luZyBibG9jay5cbiAgICogICBQcyA9IDEgIC0+IGJsaW5raW5nIGJsb2NrIChkZWZhdWx0KS5cbiAgICogICBQcyA9IDIgIC0+IHN0ZWFkeSBibG9jay5cbiAgICogICBQcyA9IDMgIC0+IGJsaW5raW5nIHVuZGVybGluZS5cbiAgICogICBQcyA9IDQgIC0+IHN0ZWFkeSB1bmRlcmxpbmUuXG4gICAqICAgUHMgPSA1ICAtPiBibGlua2luZyBiYXIgKHh0ZXJtKS5cbiAgICogICBQcyA9IDYgIC0+IHN0ZWFkeSBiYXIgKHh0ZXJtKS5cbiAgICpcbiAgICogQHZ0OiAjWSBDU0kgREVDU0NVU1IgIFwiU2V0IEN1cnNvciBTdHlsZVwiICBcIkNTSSBQcyBTUCBxXCIgICBcIlNldCBjdXJzb3Igc3R5bGUuXCJcbiAgICogU3VwcG9ydGVkIGN1cnNvciBzdHlsZXM6XG4gICAqICAtIGVtcHR5LCAwIG9yIDE6IHN0ZWFkeSBibG9ja1xuICAgKiAgLSAyOiBibGluayBibG9ja1xuICAgKiAgLSAzOiBzdGVhZHkgdW5kZXJsaW5lXG4gICAqICAtIDQ6IGJsaW5rIHVuZGVybGluZVxuICAgKiAgLSA1OiBzdGVhZHkgYmFyXG4gICAqICAtIDY6IGJsaW5rIGJhclxuICAgKi9cbiAgcHVibGljIHNldEN1cnNvclN0eWxlKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zLnBhcmFtc1swXSB8fCAxO1xuICAgIHN3aXRjaCAocGFyYW0pIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5jdXJzb3JTdHlsZSA9ICdibG9jayc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvclN0eWxlID0gJ3VuZGVybGluZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA1OlxuICAgICAgY2FzZSA2OlxuICAgICAgICB0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmN1cnNvclN0eWxlID0gJ2Jhcic7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBpc0JsaW5raW5nID0gcGFyYW0gJSAyID09PSAxO1xuICAgIHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMuY3Vyc29yQmxpbmsgPSBpc0JsaW5raW5nO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIHJcbiAgICogICBTZXQgU2Nyb2xsaW5nIFJlZ2lvbiBbdG9wO2JvdHRvbV0gKGRlZmF1bHQgPSBmdWxsIHNpemUgb2Ygd2luLVxuICAgKiAgIGRvdykgKERFQ1NUQk0pLlxuICAgKlxuICAgKiBAdnQ6ICNZIENTSSBERUNTVEJNIFwiU2V0IFRvcCBhbmQgQm90dG9tIE1hcmdpblwiIFwiQ1NJIFBzIDsgUHMgclwiIFwiU2V0IHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgb2YgdGhlIHZpZXdwb3J0IFt0b3A7Ym90dG9tXSAoZGVmYXVsdCA9IHZpZXdwb3J0IHNpemUpLlwiXG4gICAqL1xuICBwdWJsaWMgc2V0U2Nyb2xsUmVnaW9uKHBhcmFtczogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvcCA9IHBhcmFtcy5wYXJhbXNbMF0gfHwgMTtcbiAgICBsZXQgYm90dG9tOiBudW1iZXI7XG5cbiAgICBpZiAocGFyYW1zLmxlbmd0aCA8IDIgfHwgKGJvdHRvbSA9IHBhcmFtcy5wYXJhbXNbMV0pID4gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzIHx8IGJvdHRvbSA9PT0gMCkge1xuICAgICAgYm90dG9tID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIH1cblxuICAgIGlmIChib3R0b20gPiB0b3ApIHtcbiAgICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AgPSB0b3AgLSAxO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNjcm9sbEJvdHRvbSA9IGJvdHRvbSAtIDE7XG4gICAgICB0aGlzLl9zZXRDdXJzb3IoMCwgMCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENTSSBQcyA7IFBzIDsgUHMgdCAtIFZhcmlvdXMgd2luZG93IG1hbmlwdWxhdGlvbnMgYW5kIHJlcG9ydHMgKHh0ZXJtKVxuICAgKlxuICAgKiBOb3RlOiBPbmx5IHRob3NlIGxpc3RlZCBiZWxvdyBhcmUgc3VwcG9ydGVkLiBBbGwgb3RoZXJzIGFyZSBsZWZ0IHRvIGludGVncmF0b3JzIGFuZFxuICAgKiBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IGJhc2VkIG9uIHRoZSBlbWJlZGRpbmcgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqICAgIFBzID0gMSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICAgIFJlcG9ydCB4dGVybSB0ZXh0IGFyZWEgc2l6ZSBpbiBwaXhlbHMuXG4gICAqICAgICAgUmVzdWx0IGlzIENTSSA0IDsgaGVpZ2h0IDsgd2lkdGggdFxuICAgKiAgICBQcyA9IDE0IDsgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW1wbGVtZW50ZWRcbiAgICogICAgUHMgPSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgICAgUmVwb3J0IHh0ZXJtIGNoYXJhY3RlciBjZWxsIHNpemUgaW4gcGl4ZWxzLlxuICAgKiAgICAgIFJlc3VsdCBpcyBDU0kgNiA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICogICAgUHMgPSAxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgICAgUmVwb3J0IHRoZSBzaXplIG9mIHRoZSB0ZXh0IGFyZWEgaW4gY2hhcmFjdGVycy5cbiAgICogICAgICBSZXN1bHQgaXMgQ1NJIDggOyBoZWlnaHQgOyB3aWR0aCB0XG4gICAqICAgIFBzID0gMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICAgIFJlcG9ydCB4dGVybSB3aW5kb3cncyBpY29uIGxhYmVsLlxuICAgKiAgICAgIFJlc3VsdCBpcyBPU0MgTCBsYWJlbCBTVFxuICAgKiAgICBQcyA9IDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgICBSZXBvcnQgeHRlcm0gd2luZG93J3MgdGl0bGUuXG4gICAqICAgICAgUmVzdWx0IGlzIE9TQyBsIGxhYmVsIFNUXG4gICAqICAgIFBzID0gMjIgOyAwICAtPiBTYXZlIHh0ZXJtIGljb24gYW5kIHdpbmRvdyB0aXRsZSBvbiBzdGFjay4gICAgICAgIHN1cHBvcnRlZFxuICAgKiAgICBQcyA9IDIyIDsgMSAgLT4gU2F2ZSB4dGVybSBpY29uIHRpdGxlIG9uIHN0YWNrLiAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgUHMgPSAyMiA7IDIgIC0+IFNhdmUgeHRlcm0gd2luZG93IHRpdGxlIG9uIHN0YWNrLiAgICAgICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgIFBzID0gMjMgOyAwICAtPiBSZXN0b3JlIHh0ZXJtIGljb24gYW5kIHdpbmRvdyB0aXRsZSBmcm9tIHN0YWNrLiAgIHN1cHBvcnRlZFxuICAgKiAgICBQcyA9IDIzIDsgMSAgLT4gUmVzdG9yZSB4dGVybSBpY29uIHRpdGxlIGZyb20gc3RhY2suICAgICAgICAgICAgICBzdXBwb3J0ZWRcbiAgICogICAgUHMgPSAyMyA7IDIgIC0+IFJlc3RvcmUgeHRlcm0gd2luZG93IHRpdGxlIGZyb20gc3RhY2suICAgICAgICAgICAgc3VwcG9ydGVkXG4gICAqICAgIFBzID49IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBpbXBsZW1lbnRlZFxuICAgKi9cbiAgcHVibGljIHdpbmRvd09wdGlvbnMocGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKCFwYXJhbVRvV2luZG93T3B0aW9uKHBhcmFtcy5wYXJhbXNbMF0sIHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93T3B0aW9ucykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBzZWNvbmQgPSAocGFyYW1zLmxlbmd0aCA+IDEpID8gcGFyYW1zLnBhcmFtc1sxXSA6IDA7XG4gICAgc3dpdGNoIChwYXJhbXMucGFyYW1zWzBdKSB7XG4gICAgICBjYXNlIDE0OiAgLy8gR2V0V2luU2l6ZVBpeGVscywgcmV0dXJucyBDU0kgNCA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICAgICAgaWYgKHNlY29uZCAhPT0gMikge1xuICAgICAgICAgIHRoaXMuX29uUmVxdWVzdFdpbmRvd3NPcHRpb25zUmVwb3J0LmZpcmUoV2luZG93c09wdGlvbnNSZXBvcnRUeXBlLkdFVF9XSU5fU0laRV9QSVhFTFMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxNjogIC8vIEdldENlbGxTaXplUGl4ZWxzLCByZXR1cm5zIENTSSA2IDsgaGVpZ2h0IDsgd2lkdGggdFxuICAgICAgICB0aGlzLl9vblJlcXVlc3RXaW5kb3dzT3B0aW9uc1JlcG9ydC5maXJlKFdpbmRvd3NPcHRpb25zUmVwb3J0VHlwZS5HRVRfQ0VMTF9TSVpFX1BJWEVMUyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxODogIC8vIEdldFdpblNpemVDaGFycywgcmV0dXJucyBDU0kgOCA7IGhlaWdodCA7IHdpZHRoIHRcbiAgICAgICAgaWYgKHRoaXMuX2J1ZmZlclNlcnZpY2UpIHtcbiAgICAgICAgICB0aGlzLl9jb3JlU2VydmljZS50cmlnZ2VyRGF0YUV2ZW50KGAke0MwLkVTQ31bODske3RoaXMuX2J1ZmZlclNlcnZpY2Uucm93c307JHt0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHN9dGApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMjogIC8vIFB1c2hUaXRsZVxuICAgICAgICBpZiAoc2Vjb25kID09PSAwIHx8IHNlY29uZCA9PT0gMikge1xuICAgICAgICAgIHRoaXMuX3dpbmRvd1RpdGxlU3RhY2sucHVzaCh0aGlzLl93aW5kb3dUaXRsZSk7XG4gICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2subGVuZ3RoID4gU1RBQ0tfTElNSVQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpbmRvd1RpdGxlU3RhY2suc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZCA9PT0gMCB8fCBzZWNvbmQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLl9pY29uTmFtZVN0YWNrLnB1c2godGhpcy5faWNvbk5hbWUpO1xuICAgICAgICAgIGlmICh0aGlzLl9pY29uTmFtZVN0YWNrLmxlbmd0aCA+IFNUQUNLX0xJTUlUKSB7XG4gICAgICAgICAgICB0aGlzLl9pY29uTmFtZVN0YWNrLnNoaWZ0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMzogIC8vIFBvcFRpdGxlXG4gICAgICAgIGlmIChzZWNvbmQgPT09IDAgfHwgc2Vjb25kID09PSAyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2subGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRpdGxlKHRoaXMuX3dpbmRvd1RpdGxlU3RhY2sucG9wKCkhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZCA9PT0gMCB8fCBzZWNvbmQgPT09IDEpIHtcbiAgICAgICAgICBpZiAodGhpcy5faWNvbk5hbWVTdGFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SWNvbk5hbWUodGhpcy5faWNvbk5hbWVTdGFjay5wb3AoKSEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDU0kgc1xuICAgKiBFU0MgN1xuICAgKiAgIFNhdmUgY3Vyc29yIChBTlNJLlNZUykuXG4gICAqXG4gICAqIEB2dDogI1BbVE9ETy4uLl0gIENTSSBTQ09TQyAgIFwiU2F2ZSBDdXJzb3JcIiAgIFwiQ1NJIHNcIiAgIFwiU2F2ZSBjdXJzb3IgcG9zaXRpb24sIGNoYXJtYXAgYW5kIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKiBAdnQ6ICNZIEVTQyAgU0MgICBcIlNhdmUgQ3Vyc29yXCIgICBcIkVTQyA3XCIgICBcIlNhdmUgY3Vyc29yIHBvc2l0aW9uLCBjaGFybWFwIGFuZCB0ZXh0IGF0dHJpYnV0ZXMuXCJcbiAgICovXG4gIHB1YmxpYyBzYXZlQ3Vyc29yKHBhcmFtcz86IElQYXJhbXMpOiBib29sZWFuIHtcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRYID0gdGhpcy5fYWN0aXZlQnVmZmVyLng7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWSA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55O1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZEN1ckF0dHJEYXRhLmZnID0gdGhpcy5fY3VyQXR0ckRhdGEuZmc7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkQ3VyQXR0ckRhdGEuYmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5iZztcbiAgICB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0ID0gdGhpcy5fY2hhcnNldFNlcnZpY2UuY2hhcnNldDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENTSSB1XG4gICAqIEVTQyA4XG4gICAqICAgUmVzdG9yZSBjdXJzb3IgKEFOU0kuU1lTKS5cbiAgICpcbiAgICogQHZ0OiAjUFtUT0RPLi4uXSAgQ1NJIFNDT1JDIFwiUmVzdG9yZSBDdXJzb3JcIiAgXCJDU0kgdVwiICAgXCJSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiwgY2hhcm1hcCBhbmQgdGV4dCBhdHRyaWJ1dGVzLlwiXG4gICAqIEB2dDogI1kgRVNDICBSQyBcIlJlc3RvcmUgQ3Vyc29yXCIgIFwiRVNDIDhcIiAgIFwiUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24sIGNoYXJtYXAgYW5kIHRleHQgYXR0cmlidXRlcy5cIlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVDdXJzb3IocGFyYW1zPzogSVBhcmFtcyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci54ID0gdGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWCB8fCAwO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID0gTWF0aC5tYXgodGhpcy5fYWN0aXZlQnVmZmVyLnNhdmVkWSAtIHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSwgMCk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuZmcgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDdXJBdHRyRGF0YS5mZztcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5iZyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZEN1ckF0dHJEYXRhLmJnO1xuICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQgPSAodGhpcyBhcyBhbnkpLl9zYXZlZENoYXJzZXQ7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci5zYXZlZENoYXJzZXQpIHtcbiAgICAgIHRoaXMuX2NoYXJzZXRTZXJ2aWNlLmNoYXJzZXQgPSB0aGlzLl9hY3RpdmVCdWZmZXIuc2F2ZWRDaGFyc2V0O1xuICAgIH1cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogT1NDIDI7IDxkYXRhPiBTVCAoc2V0IHdpbmRvdyB0aXRsZSlcbiAgICogICBQcm94eSB0byBzZXQgd2luZG93IHRpdGxlLlxuICAgKlxuICAgKiBAdnQ6ICNQW0ljb24gbmFtZSBpcyBub3QgZXhwb3NlZC5dICAgT1NDICAgIDAgICBcIlNldCBXaW5kb3dzIFRpdGxlIGFuZCBJY29uIE5hbWVcIiAgXCJPU0MgMCA7IFB0IEJFTFwiICBcIlNldCB3aW5kb3cgdGl0bGUgYW5kIGljb24gbmFtZS5cIlxuICAgKiBJY29uIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4gRm9yIFdpbmRvdyBUaXRsZSBzZWUgYmVsb3cuXG4gICAqXG4gICAqIEB2dDogI1kgICAgIE9TQyAgICAyICAgXCJTZXQgV2luZG93cyBUaXRsZVwiICBcIk9TQyAyIDsgUHQgQkVMXCIgIFwiU2V0IHdpbmRvdyB0aXRsZS5cIlxuICAgKiB4dGVybS5qcyBkb2VzIG5vdCBtYW5pcHVsYXRlIHRoZSB0aXRsZSBkaXJlY3RseSwgaW5zdGVhZCBleHBvc2VzIGNoYW5nZXMgdmlhIHRoZSBldmVudFxuICAgKiBgVGVybWluYWwub25UaXRsZUNoYW5nZWAuXG4gICAqL1xuICBwdWJsaWMgc2V0VGl0bGUoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fd2luZG93VGl0bGUgPSBkYXRhO1xuICAgIHRoaXMuX29uVGl0bGVDaGFuZ2UuZmlyZShkYXRhKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTsgPGRhdGE+IFNUXG4gICAqIE5vdGU6IEljb24gbmFtZSBpcyBub3QgZXhwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBzZXRJY29uTmFtZShkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLl9pY29uTmFtZSA9IGRhdGE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDQ7IDxudW0+IDsgPHRleHQ+IFNUIChzZXQgQU5TSSBjb2xvciA8bnVtPiB0byA8dGV4dD4pXG4gICAqXG4gICAqIEB2dDogI1kgICAgT1NDICAgIDQgICAgXCJTZXQgQU5TSSBjb2xvclwiICAgXCJPU0MgNCA7IGMgOyBzcGVjIEJFTFwiIFwiQ2hhbmdlIGNvbG9yIG51bWJlciBgY2AgdG8gdGhlIGNvbG9yIHNwZWNpZmllZCBieSBgc3BlY2AuXCJcbiAgICogYGNgIGlzIHRoZSBjb2xvciBpbmRleCBiZXR3ZWVuIDAgYW5kIDI1NS4gVGhlIGNvbG9yIGZvcm1hdCBvZiBgc3BlY2AgaXMgZGVyaXZlZCBmcm9tXG4gICAqIGBYUGFyc2VDb2xvcmAgKHNlZSBPU0MgMTAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzKS4gVGhlcmUgbWF5IGJlIG11bHRpcGUgYGMgOyBzcGVjYCBwYWlycyBwcmVzZW50XG4gICAqIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiBJZiBgc3BlY2AgY29udGFpbnMgYD9gIHRoZSB0ZXJtaW5hbCByZXR1cm5zIGEgc2VxdWVuY2Ugd2l0aCB0aGVcbiAgICogY3VycmVudGx5IHNldCBjb2xvci5cbiAgICovXG4gIHB1YmxpYyBzZXRPclJlcG9ydEluZGV4ZWRDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBldmVudDogSUNvbG9yRXZlbnQgPSBbXTtcbiAgICBjb25zdCBzbG90cyA9IGRhdGEuc3BsaXQoJzsnKTtcbiAgICB3aGlsZSAoc2xvdHMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgaWR4ID0gc2xvdHMuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBzcGVjID0gc2xvdHMuc2hpZnQoKSBhcyBzdHJpbmc7XG4gICAgICBpZiAoL15cXGQrJC8uZXhlYyhpZHgpKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaWR4KTtcbiAgICAgICAgaWYgKGlzVmFsaWRDb2xvckluZGV4KGluZGV4KSkge1xuICAgICAgICAgIGlmIChzcGVjID09PSAnPycpIHtcbiAgICAgICAgICAgIGV2ZW50LnB1c2goeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFUE9SVCwgaW5kZXggfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbG9yID0gcGFyc2VDb2xvcihzcGVjKTtcbiAgICAgICAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgICAgICBldmVudC5wdXNoKHsgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5TRVQsIGluZGV4LCBjb2xvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV2ZW50Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fb25Db2xvci5maXJlKGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDggOyA8cGFyYW1zPiA7IDx1cmk+IFNUIC0gY3JlYXRlIGh5cGVybGlua1xuICAgKiBPU0MgOCA7IDsgU1QgLSBmaW5pc2ggaHlwZXJsaW5rXG4gICAqXG4gICAqIFRlc3QgY2FzZTpcbiAgICpcbiAgICogYGBgc2hcbiAgICogcHJpbnRmICdcXGVdODs7aHR0cDovL2V4YW1wbGUuY29tXFxlXFxcXFRoaXMgaXMgYSBsaW5rXFxlXTg7O1xcZVxcXFxcXG4nXG4gICAqIGBgYFxuICAgKlxuICAgKiBAdnQ6ICNZICAgIE9TQyAgICA4ICAgIFwiQ3JlYXRlIGh5cGVybGlua1wiICAgXCJPU0MgOCA7IHBhcmFtcyA7IHVyaSBCRUxcIiBcIkNyZWF0ZSBhIGh5cGVybGluayB0byBgdXJpYCB1c2luZyBgcGFyYW1zYC5cIlxuICAgKiBgdXJpYCBpcyBhIGh5cGVybGluayBzdGFydGluZyB3aXRoIGBodHRwOi8vYCwgYGh0dHBzOi8vYCwgYGZ0cDovL2AsIGBmaWxlOi8vYCBvciBgbWFpbHRvOi8vYC4gYHBhcmFtc2AgaXMgYW5cbiAgICogb3B0aW9uYWwgbGlzdCBvZiBrZXk9dmFsdWUgYXNzaWdubWVudHMsIHNlcGFyYXRlZCBieSB0aGUgOiBjaGFyYWN0ZXIuXG4gICAqIEV4YW1wbGU6IGBpZD14eXoxMjM6Zm9vPWJhcjpiYXo9cXV1eGAuXG4gICAqIEN1cnJlbnRseSBvbmx5IHRoZSBpZCBrZXkgaXMgZGVmaW5lZC4gQ2VsbHMgdGhhdCBzaGFyZSB0aGUgc2FtZSBJRCBhbmQgVVJJIHNoYXJlIGhvdmVyXG4gICAqIGZlZWRiYWNrLiBVc2UgYE9TQyA4IDsgOyBCRUxgIHRvIGZpbmlzaCB0aGUgY3VycmVudCBoeXBlcmxpbmsuXG4gICAqL1xuICBwdWJsaWMgc2V0SHlwZXJsaW5rKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFyZ3MgPSBkYXRhLnNwbGl0KCc7Jyk7XG4gICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoYXJnc1sxXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZUh5cGVybGluayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICB9XG4gICAgaWYgKGFyZ3NbMF0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZpbmlzaEh5cGVybGluaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSHlwZXJsaW5rKHBhcmFtczogc3RyaW5nLCB1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIEl0J3MgbGVnYWwgdG8gb3BlbiBhIG5ldyBoeXBlcmxpbmsgd2l0aG91dCBleHBsaWNpdGx5IGZpbmlzaGluZyB0aGUgcHJldmlvdXMgb25lXG4gICAgaWYgKHRoaXMuX2dldEN1cnJlbnRMaW5rSWQoKSkge1xuICAgICAgdGhpcy5fZmluaXNoSHlwZXJsaW5rKCk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZFBhcmFtcyA9IHBhcmFtcy5zcGxpdCgnOicpO1xuICAgIGxldCBpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlkUGFyYW1JbmRleCA9IHBhcnNlZFBhcmFtcy5maW5kSW5kZXgoZSA9PiBlLnN0YXJ0c1dpdGgoJ2lkPScpKTtcbiAgICBpZiAoaWRQYXJhbUluZGV4ICE9PSAtMSkge1xuICAgICAgaWQgPSBwYXJzZWRQYXJhbXNbaWRQYXJhbUluZGV4XS5zbGljZSgzKSB8fCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkID0gdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQuY2xvbmUoKTtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZC51cmxJZCA9IHRoaXMuX29zY0xpbmtTZXJ2aWNlLnJlZ2lzdGVyTGluayh7IGlkLCB1cmkgfSk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEudXBkYXRlRXh0ZW5kZWQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmlzaEh5cGVybGluaygpOiBib29sZWFuIHtcbiAgICB0aGlzLl9jdXJBdHRyRGF0YS5leHRlbmRlZCA9IHRoaXMuX2N1ckF0dHJEYXRhLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgdGhpcy5fY3VyQXR0ckRhdGEuZXh0ZW5kZWQudXJsSWQgPSAwO1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhLnVwZGF0ZUV4dGVuZGVkKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzcGVjaWFsIGNvbG9ycyAtIE9TQyAxMCB8IDExIHwgMTJcbiAgcHJpdmF0ZSBfc3BlY2lhbENvbG9ycyA9IFtTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5ELCBTcGVjaWFsQ29sb3JJbmRleC5CQUNLR1JPVU5ELCBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1JdO1xuXG4gIC8qKlxuICAgKiBBcHBseSBjb2xvcnMgcmVxdWVzdHMgZm9yIHNwZWNpYWwgY29sb3JzIGluIE9TQyAxMCB8IDExIHwgMTIuXG4gICAqIFNpbmNlIHRoZXNlIGNvbW1hbmRzIGFyZSBzdGFja2luZyBmcm9tIG11bHRpcGxlIHBhcmFtZXRlcnMsXG4gICAqIHdlIGhhbmRsZSB0aGVtIGluIGEgbG9vcCB3aXRoIGFuIGVudHJ5IG9mZnNldCB0byBgX3NwZWNpYWxDb2xvcnNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2V0T3JSZXBvcnRTcGVjaWFsQ29sb3IoZGF0YTogc3RyaW5nLCBvZmZzZXQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNsb3RzID0gZGF0YS5zcGxpdCgnOycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdHMubGVuZ3RoOyArK2ksICsrb2Zmc2V0KSB7XG4gICAgICBpZiAob2Zmc2V0ID49IHRoaXMuX3NwZWNpYWxDb2xvcnMubGVuZ3RoKSBicmVhaztcbiAgICAgIGlmIChzbG90c1tpXSA9PT0gJz8nKSB7XG4gICAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFUE9SVCwgaW5kZXg6IHRoaXMuX3NwZWNpYWxDb2xvcnNbb2Zmc2V0XSB9XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb2xvciA9IHBhcnNlQ29sb3Ioc2xvdHNbaV0pO1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5TRVQsIGluZGV4OiB0aGlzLl9zcGVjaWFsQ29sb3JzW29mZnNldF0sIGNvbG9yIH1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTAgOyA8eGNvbG9yIG5hbWU+fDw/PiBTVCAtIHNldCBvciBxdWVyeSBkZWZhdWx0IGZvcmVncm91bmQgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTAgICAgXCJTZXQgb3IgcXVlcnkgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yXCIgICBcIk9TQyAxMCA7IFB0IEJFTFwiICBcIlNldCBvciBxdWVyeSBkZWZhdWx0IGZvcmVncm91bmQgY29sb3IuXCJcbiAgICogVG8gc2V0IHRoZSBjb2xvciwgdGhlIGZvbGxvd2luZyBjb2xvciBzcGVjaWZpY2F0aW9uIGZvcm1hdHMgYXJlIHN1cHBvcnRlZDpcbiAgICogLSBgcmdiOjxyZWQ+LzxncmVlbj4vPGJsdWU+YCBmb3IgIGA8cmVkPiwgPGdyZWVuPiwgPGJsdWU+YCBpbiBgaCB8IGhoIHwgaGhoIHwgaGhoaGAsIHdoZXJlXG4gICAqICAgYGhgIGlzIGEgc2luZ2xlIGhleGFkZWNpbWFsIGRpZ2l0IChjYXNlIGluc2lnbmlmaWNhbnQpLiBUaGUgZGlmZmVyZW50IHdpZHRocyBzY2FsZVxuICAgKiAgIGZyb20gNCBiaXQgKGBoYCkgdG8gMTYgYml0IChgaGhoaGApIGFuZCBnZXQgY29udmVydGVkIHRvIDggYml0IChgaGhgKS5cbiAgICogLSBgI1JHQmAgLSA0IGJpdHMgcGVyIGNoYW5uZWwsIGV4cGFuZGVkIHRvIGAjUjBHMEIwYFxuICAgKiAtIGAjUlJHR0JCYCAtIDggYml0cyBwZXIgY2hhbm5lbFxuICAgKiAtIGAjUlJSR0dHQkJCYCAtIDEyIGJpdHMgcGVyIGNoYW5uZWwsIHRydW5jYXRlZCB0byBgI1JSR0dCQmBcbiAgICogLSBgI1JSUlJHR0dHQkJCQmAgLSAxNiBiaXRzIHBlciBjaGFubmVsLCB0cnVuY2F0ZWQgdG8gYCNSUkdHQkJgXG4gICAqXG4gICAqICoqTm90ZToqKiBYMTEgbmFtZWQgY29sb3JzIGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuXG4gICAqXG4gICAqIElmIGBQdGAgY29udGFpbnMgYD9gIGluc3RlYWQgb2YgYSBjb2xvciBzcGVjaWZpY2F0aW9uLCB0aGUgdGVybWluYWxcbiAgICogcmV0dXJucyBhIHNlcXVlbmNlIHdpdGggdGhlIGN1cnJlbnQgZGVmYXVsdCBmb3JlZ3JvdW5kIGNvbG9yXG4gICAqICh1c2UgdGhhdCBzZXF1ZW5jZSB0byByZXN0b3JlIHRoZSBjb2xvciBhZnRlciBjaGFuZ2VzKS5cbiAgICpcbiAgICogKipOb3RlOioqIE90aGVyIHRoYW4geHRlcm0sIHh0ZXJtLmpzIGRvZXMgbm90IHN1cHBvcnQgT1NDIDEyIC0gMTkuXG4gICAqIFRoZXJlZm9yZSBzdGFja2luZyBtdWx0aXBsZSBgUHRgIHNlcGFyYXRlZCBieSBgO2Agb25seSB3b3JrcyBmb3IgdGhlIGZpcnN0IHR3byBlbnRyaWVzLlxuICAgKi9cbiAgcHVibGljIHNldE9yUmVwb3J0RmdDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0T3JSZXBvcnRTcGVjaWFsQ29sb3IoZGF0YSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDExIDsgPHhjb2xvciBuYW1lPnw8Pz4gU1QgLSBzZXQgb3IgcXVlcnkgZGVmYXVsdCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDExICAgIFwiU2V0IG9yIHF1ZXJ5IGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvclwiICAgXCJPU0MgMTEgOyBQdCBCRUxcIiAgXCJTYW1lIGFzIE9TQyAxMCwgYnV0IGZvciBkZWZhdWx0IGJhY2tncm91bmQuXCJcbiAgICovXG4gIHB1YmxpYyBzZXRPclJlcG9ydEJnQ29sb3IoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NldE9yUmVwb3J0U3BlY2lhbENvbG9yKGRhdGEsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMiA7IDx4Y29sb3IgbmFtZT58PD8+IFNUIC0gc2V0IG9yIHF1ZXJ5IGRlZmF1bHQgY3Vyc29yIGNvbG9yXG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDEyICAgIFwiU2V0IG9yIHF1ZXJ5IGRlZmF1bHQgY3Vyc29yIGNvbG9yXCIgICBcIk9TQyAxMiA7IFB0IEJFTFwiICBcIlNhbWUgYXMgT1NDIDEwLCBidXQgZm9yIGRlZmF1bHQgY3Vyc29yIGNvbG9yLlwiXG4gICAqL1xuICBwdWJsaWMgc2V0T3JSZXBvcnRDdXJzb3JDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0T3JSZXBvcnRTcGVjaWFsQ29sb3IoZGF0YSwgMik7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDEwNCA7IDxudW0+IFNUIC0gcmVzdG9yZSBBTlNJIGNvbG9yIDxudW0+XG4gICAqXG4gICAqIEB2dDogI1kgIE9TQyAgIDEwNCAgICBcIlJlc2V0IEFOU0kgY29sb3JcIiAgIFwiT1NDIDEwNCA7IGMgQkVMXCIgXCJSZXNldCBjb2xvciBudW1iZXIgYGNgIHRvIHRoZW1lZCBjb2xvci5cIlxuICAgKiBgY2AgaXMgdGhlIGNvbG9yIGluZGV4IGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIGZ1bmN0aW9uIHJlc3RvcmVzIHRoZSBkZWZhdWx0IGNvbG9yIGZvciBgY2AgYXNcbiAgICogc3BlY2lmaWVkIGJ5IHRoZSBsb2FkZWQgdGhlbWUuIEFueSBudW1iZXIgb2YgYGNgIHBhcmFtZXRlcnMgbWF5IGJlIGdpdmVuLlxuICAgKiBJZiBubyBwYXJhbWV0ZXJzIGFyZSBnaXZlbiwgdGhlIGVudGlyZSBpbmRleGVkIGNvbG9yIHRhYmxlIHdpbGwgYmUgcmVzZXQuXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZUluZGV4ZWRDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUgfV0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50OiBJQ29sb3JFdmVudCA9IFtdO1xuICAgIGNvbnN0IHNsb3RzID0gZGF0YS5zcGxpdCgnOycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xvdHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICgvXlxcZCskLy5leGVjKHNsb3RzW2ldKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHNsb3RzW2ldKTtcbiAgICAgICAgaWYgKGlzVmFsaWRDb2xvckluZGV4KGluZGV4KSkge1xuICAgICAgICAgIGV2ZW50LnB1c2goeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX29uQ29sb3IuZmlyZShldmVudCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9TQyAxMTAgU1QgLSByZXN0b3JlIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvclxuICAgKlxuICAgKiBAdnQ6ICNZICBPU0MgICAxMTAgICAgXCJSZXN0b3JlIGRlZmF1bHQgZm9yZWdyb3VuZCBjb2xvclwiICAgXCJPU0MgMTEwIEJFTFwiICBcIlJlc3RvcmUgZGVmYXVsdCBmb3JlZ3JvdW5kIHRvIHRoZW1lZCBjb2xvci5cIlxuICAgKi9cbiAgcHVibGljIHJlc3RvcmVGZ0NvbG9yKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUsIGluZGV4OiBTcGVjaWFsQ29sb3JJbmRleC5GT1JFR1JPVU5EIH1dKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPU0MgMTExIFNUIC0gcmVzdG9yZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTExICAgIFwiUmVzdG9yZSBkZWZhdWx0IGJhY2tncm91bmQgY29sb3JcIiAgIFwiT1NDIDExMSBCRUxcIiAgXCJSZXN0b3JlIGRlZmF1bHQgYmFja2dyb3VuZCB0byB0aGVtZWQgY29sb3IuXCJcbiAgICovXG4gIHB1YmxpYyByZXN0b3JlQmdDb2xvcihkYXRhOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aGlzLl9vbkNvbG9yLmZpcmUoW3sgdHlwZTogQ29sb3JSZXF1ZXN0VHlwZS5SRVNUT1JFLCBpbmRleDogU3BlY2lhbENvbG9ySW5kZXguQkFDS0dST1VORCB9XSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT1NDIDExMiBTVCAtIHJlc3RvcmUgZGVmYXVsdCBjdXJzb3IgY29sb3JcbiAgICpcbiAgICogQHZ0OiAjWSAgT1NDICAgMTEyICAgIFwiUmVzdG9yZSBkZWZhdWx0IGN1cnNvciBjb2xvclwiICAgXCJPU0MgMTEyIEJFTFwiICBcIlJlc3RvcmUgZGVmYXVsdCBjdXJzb3IgdG8gdGhlbWVkIGNvbG9yLlwiXG4gICAqL1xuICBwdWJsaWMgcmVzdG9yZUN1cnNvckNvbG9yKGRhdGE6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX29uQ29sb3IuZmlyZShbeyB0eXBlOiBDb2xvclJlcXVlc3RUeXBlLlJFU1RPUkUsIGluZGV4OiBTcGVjaWFsQ29sb3JJbmRleC5DVVJTT1IgfV0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBFXG4gICAqIEMxLk5FTFxuICAgKiAgIERFQyBtbmVtb25pYzogTkVMIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL05FTClcbiAgICogICBNb3ZlcyBjdXJzb3IgdG8gZmlyc3QgcG9zaXRpb24gb24gbmV4dCBsaW5lLlxuICAgKlxuICAgKiBAdnQ6ICNZICAgQzEgICAgTkVMICAgXCJOZXh0IExpbmVcIiAgIFwiXFx4ODVcIiAgICBcIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdy5cIlxuICAgKiBAdnQ6ICNZICAgRVNDICAgTkVMICAgXCJOZXh0IExpbmVcIiAgIFwiRVNDIEVcIiAgIFwiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcm93LlwiXG4gICAqL1xuICBwdWJsaWMgbmV4dExpbmUoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnggPSAwO1xuICAgIHRoaXMuaW5kZXgoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgPVxuICAgKiAgIERFQyBtbmVtb25pYzogREVDS1BBTSAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNLUEFNLmh0bWwpXG4gICAqICAgRW5hYmxlcyB0aGUgbnVtZXJpYyBrZXlwYWQgdG8gc2VuZCBhcHBsaWNhdGlvbiBzZXF1ZW5jZXMgdG8gdGhlIGhvc3QuXG4gICAqL1xuICBwdWJsaWMga2V5cGFkQXBwbGljYXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1NlcmlhbCBwb3J0IHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBrZXlwYWQuJyk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gdHJ1ZTtcbiAgICB0aGlzLl9vblJlcXVlc3RTeW5jU2Nyb2xsQmFyLmZpcmUoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgPlxuICAgKiAgIERFQyBtbmVtb25pYzogREVDS1BOTSAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNLUE5NLmh0bWwpXG4gICAqICAgRW5hYmxlcyB0aGUga2V5cGFkIHRvIHNlbmQgbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHRoZSBob3N0LlxuICAgKi9cbiAgcHVibGljIGtleXBhZE51bWVyaWNNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoJ1N3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuJyk7XG4gICAgdGhpcy5fY29yZVNlcnZpY2UuZGVjUHJpdmF0ZU1vZGVzLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgdGhpcy5fb25SZXF1ZXN0U3luY1Njcm9sbEJhci5maXJlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDICUgQFxuICAgKiBFU0MgJSBHXG4gICAqICAgU2VsZWN0IGRlZmF1bHQgY2hhcmFjdGVyIHNldC4gVVRGLTggaXMgbm90IHN1cHBvcnRlZCAoc3RyaW5nIGFyZSB1bmljb2RlIGFueXdheXMpXG4gICAqICAgdGhlcmVmb3JlIEVTQyAlIEcgZG9lcyB0aGUgc2FtZS5cbiAgICovXG4gIHB1YmxpYyBzZWxlY3REZWZhdWx0Q2hhcnNldCgpOiBib29sZWFuIHtcbiAgICB0aGlzLl9jaGFyc2V0U2VydmljZS5zZXRnTGV2ZWwoMCk7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoMCwgREVGQVVMVF9DSEFSU0VUKTsgLy8gVVMgKGRlZmF1bHQpXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDICggQ1xuICAgKiAgIERlc2lnbmF0ZSBHMCBDaGFyYWN0ZXIgU2V0LCBWVDEwMCwgSVNPIDIwMjIuXG4gICAqIEVTQyApIENcbiAgICogICBEZXNpZ25hdGUgRzEgQ2hhcmFjdGVyIFNldCAoSVNPIDIwMjIsIFZUMTAwKS5cbiAgICogRVNDICogQ1xuICAgKiAgIERlc2lnbmF0ZSBHMiBDaGFyYWN0ZXIgU2V0IChJU08gMjAyMiwgVlQyMjApLlxuICAgKiBFU0MgKyBDXG4gICAqICAgRGVzaWduYXRlIEczIENoYXJhY3RlciBTZXQgKElTTyAyMDIyLCBWVDIyMCkuXG4gICAqIEVTQyAtIENcbiAgICogICBEZXNpZ25hdGUgRzEgQ2hhcmFjdGVyIFNldCAoVlQzMDApLlxuICAgKiBFU0MgLiBDXG4gICAqICAgRGVzaWduYXRlIEcyIENoYXJhY3RlciBTZXQgKFZUMzAwKS5cbiAgICogRVNDIC8gQ1xuICAgKiAgIERlc2lnbmF0ZSBHMyBDaGFyYWN0ZXIgU2V0IChWVDMwMCkuIEMgPSBBICAtPiBJU08gTGF0aW4tMSBTdXBwbGVtZW50YWwuIC0gU3VwcG9ydGVkP1xuICAgKi9cbiAgcHVibGljIHNlbGVjdENoYXJzZXQoY29sbGVjdEFuZEZsYWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChjb2xsZWN0QW5kRmxhZy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRoaXMuc2VsZWN0RGVmYXVsdENoYXJzZXQoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29sbGVjdEFuZEZsYWdbMF0gPT09ICcvJykge1xuICAgICAgcmV0dXJuIHRydWU7ICAvLyBUT0RPOiBJcyB0aGlzIHN1cHBvcnRlZD9cbiAgICB9XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0NoYXJzZXQoR0xFVkVMW2NvbGxlY3RBbmRGbGFnWzBdXSwgQ0hBUlNFVFNbY29sbGVjdEFuZEZsYWdbMV1dIHx8IERFRkFVTFRfQ0hBUlNFVCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRVNDIERcbiAgICogQzEuSU5EXG4gICAqICAgREVDIG1uZW1vbmljOiBJTkQgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vSU5ELmh0bWwpXG4gICAqICAgTW92ZXMgdGhlIGN1cnNvciBkb3duIG9uZSBsaW5lIGluIHRoZSBzYW1lIGNvbHVtbi5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMxICAgIElORCAgIFwiSW5kZXhcIiAgIFwiXFx4ODRcIiAgICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgbGluZSBkb3duIHNjcm9sbGluZyBpZiBuZWVkZWQuXCJcbiAgICogQHZ0OiAjWSAgIEVTQyAgIElORCAgIFwiSW5kZXhcIiAgIFwiRVNDIERcIiAgIFwiTW92ZSB0aGUgY3Vyc29yIG9uZSBsaW5lIGRvd24gc2Nyb2xsaW5nIGlmIG5lZWRlZC5cIlxuICAgKi9cbiAgcHVibGljIGluZGV4KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkrKztcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyLnkgPT09IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gKyAxKSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgdGhpcy5fYnVmZmVyU2VydmljZS5zY3JvbGwodGhpcy5fZXJhc2VBdHRyRGF0YSgpKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID49IHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cykge1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLnkgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MgLSAxO1xuICAgIH1cbiAgICB0aGlzLl9yZXN0cmljdEN1cnNvcigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBIXG4gICAqIEMxLkhUU1xuICAgKiAgIERFQyBtbmVtb25pYzogSFRTIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0hUUy5odG1sKVxuICAgKiAgIFNldHMgYSBob3Jpem9udGFsIHRhYiBzdG9wIGF0IHRoZSBjb2x1bW4gcG9zaXRpb24gaW5kaWNhdGVkIGJ5XG4gICAqICAgdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgY29sdW1uIHdoZW4gdGhlIHRlcm1pbmFsIHJlY2VpdmVzIGFuIEhUUy5cbiAgICpcbiAgICogQHZ0OiAjWSAgIEMxICAgIEhUUyAgIFwiSG9yaXpvbnRhbCBUYWJ1bGF0aW9uIFNldFwiIFwiXFx4ODhcIiAgICBcIlBsYWNlcyBhIHRhYiBzdG9wIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi5cIlxuICAgKiBAdnQ6ICNZICAgRVNDICAgSFRTICAgXCJIb3Jpem9udGFsIFRhYnVsYXRpb24gU2V0XCIgXCJFU0MgSFwiICAgXCJQbGFjZXMgYSB0YWIgc3RvcCBhdCB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uXCJcbiAgICovXG4gIHB1YmxpYyB0YWJTZXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyLnRhYnNbdGhpcy5fYWN0aXZlQnVmZmVyLnhdID0gdHJ1ZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgTVxuICAgKiBDMS5SSVxuICAgKiAgIERFQyBtbmVtb25pYzogSFRTXG4gICAqICAgTW92ZXMgdGhlIGN1cnNvciB1cCBvbmUgbGluZSBpbiB0aGUgc2FtZSBjb2x1bW4uIElmIHRoZSBjdXJzb3IgaXMgYXQgdGhlIHRvcCBtYXJnaW4sXG4gICAqICAgdGhlIHBhZ2Ugc2Nyb2xscyBkb3duLlxuICAgKlxuICAgKiBAdnQ6ICNZIEVTQyAgSVIgXCJSZXZlcnNlIEluZGV4XCIgXCJFU0MgTVwiICBcIk1vdmUgdGhlIGN1cnNvciBvbmUgbGluZSB1cCBzY3JvbGxpbmcgaWYgbmVlZGVkLlwiXG4gICAqL1xuICBwdWJsaWMgcmV2ZXJzZUluZGV4KCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc3RyaWN0Q3Vyc29yKCk7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZUJ1ZmZlci55ID09PSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wKSB7XG4gICAgICAvLyBwb3NzaWJseSBtb3ZlIHRoZSBjb2RlIGJlbG93IHRvIHRlcm0ucmV2ZXJzZVNjcm9sbCgpO1xuICAgICAgLy8gdGVzdDogZWNobyAtbmUgJ1xcZVsxOzFIXFxlWzQ0bVxcZU1cXGVbMG0nXG4gICAgICAvLyBibGFua0xpbmUodHJ1ZSkgaXMgeHRlcm0vbGludXggYmVoYXZpb3JcbiAgICAgIGNvbnN0IHNjcm9sbFJlZ2lvbkhlaWdodCA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20gLSB0aGlzLl9hY3RpdmVCdWZmZXIuc2Nyb2xsVG9wO1xuICAgICAgdGhpcy5fYWN0aXZlQnVmZmVyLmxpbmVzLnNoaWZ0RWxlbWVudHModGhpcy5fYWN0aXZlQnVmZmVyLnliYXNlICsgdGhpcy5fYWN0aXZlQnVmZmVyLnksIHNjcm9sbFJlZ2lvbkhlaWdodCwgMSk7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuc2V0KHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55LCB0aGlzLl9hY3RpdmVCdWZmZXIuZ2V0QmxhbmtMaW5lKHRoaXMuX2VyYXNlQXR0ckRhdGEoKSkpO1xuICAgICAgdGhpcy5fZGlydHlSb3dUcmFja2VyLm1hcmtSYW5nZURpcnR5KHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxUb3AsIHRoaXMuX2FjdGl2ZUJ1ZmZlci5zY3JvbGxCb3R0b20pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hY3RpdmVCdWZmZXIueS0tO1xuICAgICAgdGhpcy5fcmVzdHJpY3RDdXJzb3IoKTsgLy8gcXVpY2tmaXggdG8gbm90IHJ1biBvdXQgb2YgYm91bmRzXG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVTQyBjXG4gICAqICAgREVDIG1uZW1vbmljOiBSSVMgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vUklTLmh0bWwpXG4gICAqICAgUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBmdWxsUmVzZXQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcGFyc2VyLnJlc2V0KCk7XG4gICAgdGhpcy5fb25SZXF1ZXN0UmVzZXQuZmlyZSgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2N1ckF0dHJEYXRhID0gREVGQVVMVF9BVFRSX0RBVEEuY2xvbmUoKTtcbiAgICB0aGlzLl9lcmFzZUF0dHJEYXRhSW50ZXJuYWwgPSBERUZBVUxUX0FUVFJfREFUQS5jbG9uZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGJhY2tfY29sb3JfZXJhc2UgZmVhdHVyZSBmb3IgeHRlcm0uXG4gICAqL1xuICBwcml2YXRlIF9lcmFzZUF0dHJEYXRhKCk6IElBdHRyaWJ1dGVEYXRhIHtcbiAgICB0aGlzLl9lcmFzZUF0dHJEYXRhSW50ZXJuYWwuYmcgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCAweEZGRkZGRik7XG4gICAgdGhpcy5fZXJhc2VBdHRyRGF0YUludGVybmFsLmJnIHw9IHRoaXMuX2N1ckF0dHJEYXRhLmJnICYgfjB4RkMwMDAwMDA7XG4gICAgcmV0dXJuIHRoaXMuX2VyYXNlQXR0ckRhdGFJbnRlcm5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgblxuICAgKiBFU0Mgb1xuICAgKiBFU0MgfFxuICAgKiBFU0MgfVxuICAgKiBFU0MgflxuICAgKiAgIERFQyBtbmVtb25pYzogTFMgKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vTFMuaHRtbClcbiAgICogICBXaGVuIHlvdSB1c2UgYSBsb2NraW5nIHNoaWZ0LCB0aGUgY2hhcmFjdGVyIHNldCByZW1haW5zIGluIEdMIG9yIEdSIHVudGlsXG4gICAqICAgeW91IHVzZSBhbm90aGVyIGxvY2tpbmcgc2hpZnQuIChwYXJ0bHkgc3VwcG9ydGVkKVxuICAgKi9cbiAgcHVibGljIHNldGdMZXZlbChsZXZlbDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgdGhpcy5fY2hhcnNldFNlcnZpY2Uuc2V0Z0xldmVsKGxldmVsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFU0MgIyA4XG4gICAqICAgREVDIG1uZW1vbmljOiBERUNBTE4gKGh0dHBzOi8vdnQxMDAubmV0L2RvY3MvdnQ1MTAtcm0vREVDQUxOLmh0bWwpXG4gICAqICAgVGhpcyBjb250cm9sIGZ1bmN0aW9uIGZpbGxzIHRoZSBjb21wbGV0ZSBzY3JlZW4gYXJlYSB3aXRoXG4gICAqICAgYSB0ZXN0IHBhdHRlcm4gKEUpIHVzZWQgZm9yIGFkanVzdGluZyBzY3JlZW4gYWxpZ25tZW50LlxuICAgKlxuICAgKiBAdnQ6ICNZICAgRVNDICAgREVDQUxOICAgXCJTY3JlZW4gQWxpZ25tZW50IFBhdHRlcm5cIiAgXCJFU0MgIyA4XCIgIFwiRmlsbCB2aWV3cG9ydCB3aXRoIGEgdGVzdCBwYXR0ZXJuIChFKS5cIlxuICAgKi9cbiAgcHVibGljIHNjcmVlbkFsaWdubWVudFBhdHRlcm4oKTogYm9vbGVhbiB7XG4gICAgLy8gcHJlcGFyZSBjZWxsIGRhdGFcbiAgICBjb25zdCBjZWxsID0gbmV3IENlbGxEYXRhKCk7XG4gICAgY2VsbC5jb250ZW50ID0gMSA8PCBDb250ZW50LldJRFRIX1NISUZUIHwgJ0UnLmNoYXJDb2RlQXQoMCk7XG4gICAgY2VsbC5mZyA9IHRoaXMuX2N1ckF0dHJEYXRhLmZnO1xuICAgIGNlbGwuYmcgPSB0aGlzLl9jdXJBdHRyRGF0YS5iZztcblxuXG4gICAgdGhpcy5fc2V0Q3Vyc29yKDAsIDApO1xuICAgIGZvciAobGV0IHlPZmZzZXQgPSAwOyB5T2Zmc2V0IDwgdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzOyArK3lPZmZzZXQpIHtcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX2FjdGl2ZUJ1ZmZlci55YmFzZSArIHRoaXMuX2FjdGl2ZUJ1ZmZlci55ICsgeU9mZnNldDtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9hY3RpdmVCdWZmZXIubGluZXMuZ2V0KHJvdyk7XG4gICAgICBpZiAobGluZSkge1xuICAgICAgICBsaW5lLmZpbGwoY2VsbCk7XG4gICAgICAgIGxpbmUuaXNXcmFwcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrQWxsRGlydHkoKTtcbiAgICB0aGlzLl9zZXRDdXJzb3IoMCwgMCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBEQ1MgJCBxIFB0IFNUXG4gICAqICAgREVDUlFTUyAoaHR0cHM6Ly92dDEwMC5uZXQvZG9jcy92dDUxMC1ybS9ERUNSUVNTLmh0bWwpXG4gICAqICAgUmVxdWVzdCBTdGF0dXMgU3RyaW5nIChERUNSUVNTKSwgVlQ0MjAgYW5kIHVwLlxuICAgKiAgIFJlc3BvbnNlOiBERUNSUFNTIChodHRwczovL3Z0MTAwLm5ldC9kb2NzL3Z0NTEwLXJtL0RFQ1JQU1MuaHRtbClcbiAgICpcbiAgICogQHZ0OiAjUFtMaW1pdGVkIHN1cHBvcnQsIHNlZSBiZWxvdy5dICBEQ1MgICBERUNSUVNTICAgXCJSZXF1ZXN0IFNlbGVjdGlvbiBvciBTZXR0aW5nXCIgIFwiRENTICQgcSBQdCBTVFwiICAgXCJSZXF1ZXN0IHNldmVyYWwgdGVybWluYWwgc2V0dGluZ3MuXCJcbiAgICogUmVzcG9uc2UgaXMgaW4gdGhlIGZvcm0gYEVTQyBQIDEgJCByIFB0IFNUYCBmb3IgdmFsaWQgcmVxdWVzdHMsIHdoZXJlIGBQdGAgY29udGFpbnMgdGhlXG4gICAqIGNvcnJlc3BvbmRpbmcgQ1NJIHN0cmluZywgYEVTQyBQIDAgU1RgIGZvciBpbnZhbGlkIHJlcXVlc3RzLlxuICAgKlxuICAgKiBTdXBwb3J0ZWQgcmVxdWVzdHMgYW5kIHJlc3BvbnNlczpcbiAgICpcbiAgICogfCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlcXVlc3QgICAgICAgICAgIHwgUmVzcG9uc2UgKGBQdGApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqIHwgR3JhcGhpYyBSZW5kaXRpb24gKFNHUikgICAgICAgICAgfCBgRENTICQgcSBtIFNUYCAgICB8IGFsd2F5cyByZXBvcnRpbmcgYDBtYCAoY3VycmVudGx5IGJyb2tlbikgICAgICAgICAgICAgIHxcbiAgICogfCBUb3AgYW5kIEJvdHRvbSBNYXJnaW5zIChERUNTVEJNKSB8IGBEQ1MgJCBxIHIgU1RgICAgIHwgYFBzIDsgUHMgcmAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKiB8IEN1cnNvciBTdHlsZSAoREVDU0NVU1IpICAgICAgICAgIHwgYERDUyAkIHEgU1AgcSBTVGAgfCBgUHMgU1AgcWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUHJvdGVjdGlvbiBBdHRyaWJ1dGUgKERFQ1NDQSkgICAgfCBgRENTICQgcSBcIiBxIFNUYCAgfCBgUHMgXCIgcWAgKERFQ1NDQSAyIGlzIHJlcG9ydGVkIGFzIFBzID0gMCkgICAgICAgICAgICAgfFxuICAgKiB8IENvbmZvcm1hbmNlIExldmVsIChERUNTQ0wpICAgICAgIHwgYERDUyAkIHEgXCIgcCBTVGAgIHwgYWx3YXlzIHJlcG9ydGluZyBgNjEgOyAxIFwiIHBgIChERUNTQ0wgaXMgdW5zdXBwb3J0ZWQpIHxcbiAgICpcbiAgICpcbiAgICogVE9ETzpcbiAgICogLSBmaXggU0dSIHJlcG9ydFxuICAgKiAtIGVpdGhlciBjaGVjayB3aGljaCBjb25mb3JtYW5jZSBpcyBiZXR0ZXIgc3VpdGVkIG9yIHJlbW92ZSB0aGUgcmVwb3J0IGNvbXBsZXRlbHlcbiAgICogICAtLT4gd2UgYXJlIGN1cnJlbnRseSBhIG1peHR1cmUgb2YgYWxsIHVwIHRvIFZUNDAwIGJ1dCBkb250IGZvbGxvdyBhbnlvbmUgc3RyaWN0bHlcbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0U3RhdHVzU3RyaW5nKGRhdGE6IHN0cmluZywgcGFyYW1zOiBJUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZiA9IChzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJEYXRhRXZlbnQoYCR7QzAuRVNDfSR7c30ke0MwLkVTQ31cXFxcYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLy8gYWNjZXNzIGhlbHBlcnNcbiAgICBjb25zdCBiID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnM7XG4gICAgY29uc3QgU1RZTEVTOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0geyAnYmxvY2snOiAyLCAndW5kZXJsaW5lJzogNCwgJ2Jhcic6IDYgfTtcblxuICAgIGlmIChkYXRhID09PSAnXCJxJykgcmV0dXJuIGYoYFAxJHIke3RoaXMuX2N1ckF0dHJEYXRhLmlzUHJvdGVjdGVkKCkgPyAxIDogMH1cInFgKTtcbiAgICBpZiAoZGF0YSA9PT0gJ1wicCcpIHJldHVybiBmKGBQMSRyNjE7MVwicGApO1xuICAgIGlmIChkYXRhID09PSAncicpIHJldHVybiBmKGBQMSRyJHtiLnNjcm9sbFRvcCArIDF9OyR7Yi5zY3JvbGxCb3R0b20gKyAxfXJgKTtcbiAgICAvLyBGSVhNRTogcmVwb3J0IHJlYWwgU0dSIHNldHRpbmdzIGluc3RlYWQgb2YgMG1cbiAgICBpZiAoZGF0YSA9PT0gJ20nKSByZXR1cm4gZihgUDEkcjBtYCk7XG4gICAgaWYgKGRhdGEgPT09ICcgcScpIHJldHVybiBmKGBQMSRyJHtTVFlMRVNbb3B0cy5jdXJzb3JTdHlsZV0gLSAob3B0cy5jdXJzb3JCbGluayA/IDEgOiAwKX0gcWApO1xuICAgIHJldHVybiBmKGBQMCRyYCk7XG4gIH1cblxuICBwdWJsaWMgbWFya1JhbmdlRGlydHkoeTE6IG51bWJlciwgeTI6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2RpcnR5Um93VHJhY2tlci5tYXJrUmFuZ2VEaXJ0eSh5MSwgeTIpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpcnR5Um93VHJhY2tlciB7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVuZDogbnVtYmVyO1xuXG4gIGNsZWFyUmFuZ2UoKTogdm9pZDtcbiAgbWFya0RpcnR5KHk6IG51bWJlcik6IHZvaWQ7XG4gIG1hcmtSYW5nZURpcnR5KHkxOiBudW1iZXIsIHkyOiBudW1iZXIpOiB2b2lkO1xuICBtYXJrQWxsRGlydHkoKTogdm9pZDtcbn1cblxuY2xhc3MgRGlydHlSb3dUcmFja2VyIGltcGxlbWVudHMgSURpcnR5Um93VHJhY2tlciB7XG4gIHB1YmxpYyBzdGFydCE6IG51bWJlcjtcbiAgcHVibGljIGVuZCE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASUJ1ZmZlclNlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5jbGVhclJhbmdlKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJSYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXJ0ID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXIueTtcbiAgICB0aGlzLmVuZCA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuYnVmZmVyLnk7XG4gIH1cblxuICBwdWJsaWMgbWFya0RpcnR5KHk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh5IDwgdGhpcy5zdGFydCkge1xuICAgICAgdGhpcy5zdGFydCA9IHk7XG4gICAgfSBlbHNlIGlmICh5ID4gdGhpcy5lbmQpIHtcbiAgICAgIHRoaXMuZW5kID0geTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWFya1JhbmdlRGlydHkoeTE6IG51bWJlciwgeTI6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh5MSA+IHkyKSB7XG4gICAgICAkdGVtcCA9IHkxO1xuICAgICAgeTEgPSB5MjtcbiAgICAgIHkyID0gJHRlbXA7XG4gICAgfVxuICAgIGlmICh5MSA8IHRoaXMuc3RhcnQpIHtcbiAgICAgIHRoaXMuc3RhcnQgPSB5MTtcbiAgICB9XG4gICAgaWYgKHkyID4gdGhpcy5lbmQpIHtcbiAgICAgIHRoaXMuZW5kID0geTI7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1hcmtBbGxEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtSYW5nZURpcnR5KDAsIHRoaXMuX2J1ZmZlclNlcnZpY2Uucm93cyAtIDEpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRDb2xvckluZGV4KHZhbHVlOiBudW1iZXIpOiB2YWx1ZSBpcyBDb2xvckluZGV4IHtcbiAgcmV0dXJuIDAgPD0gdmFsdWUgJiYgdmFsdWUgPCAyNTY7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgdG8gcHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBtYW5hZ2luZyB0aGUgbGlmZWN5Y2xlIG9mIGFuXG4gKiBvYmplY3QgYW5kIGl0cyBjb21wb25lbnRzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIF9kaXNwb3NhYmxlczogSURpc3Bvc2FibGVbXSA9IFtdO1xuICBwcm90ZWN0ZWQgX2lzRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCwgdHJpZ2dlcmluZyB0aGUgYGRpc3Bvc2VgIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBJRGlzcG9zYWJsZXMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGQgb2YgdGhpcy5fZGlzcG9zYWJsZXMpIHtcbiAgICAgIGQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5sZW5ndGggPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0LlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byByZWdpc3Rlci5cbiAgICogQHJldHVybnMgVGhlIGRpc3Bvc2FibGUuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogVCB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChkKTtcbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIGRpc3Bvc2FibGUgb2JqZWN0IGlmIGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQsIGlmIG5vdCBkb1xuICAgKiBub3RoaW5nLlxuICAgKiBAcGFyYW0gZCBUaGUgZGlzcG9zYWJsZSB0byB1bnJlZ2lzdGVyLlxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkOiBUKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9kaXNwb3NhYmxlcy5pbmRleE9mKGQpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhYmxlRGlzcG9zYWJsZTxUIGV4dGVuZHMgSURpc3Bvc2FibGU+IGltcGxlbWVudHMgSURpc3Bvc2FibGUge1xuICBwcml2YXRlIF92YWx1ZT86IFQ7XG4gIHByaXZhdGUgX2lzRGlzcG9zZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgaWYgaXQgZXhpc3RzLlxuICAgKi9cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXNwb3NlZCA/IHVuZGVmaW5lZCA6IHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlLCBkaXNwb3Npbmcgb2YgdGhlIG9sZCB2YWx1ZSBpZiBpdCBleGlzdHMuXG4gICAqL1xuICBwdWJsaWMgc2V0IHZhbHVlKHZhbHVlOiBUIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQgfHwgdmFsdWUgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlZCB2YWx1ZSBhbmQgZGlzcG9zZXMgb2YgdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV3JhcCBhIGZ1bmN0aW9uIGluIGEgZGlzcG9zYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvRGlzcG9zYWJsZShmOiAoKSA9PiB2b2lkKTogSURpc3Bvc2FibGUge1xuICByZXR1cm4geyBkaXNwb3NlOiBmIH07XG59XG5cbi8qKlxuICogRGlzcG9zZSBvZiBhbGwgZGlzcG9zYWJsZXMgaW4gYW4gYXJyYXkgYW5kIHNldCBpdHMgbGVuZ3RoIHRvIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlQXJyYXkoZGlzcG9zYWJsZXM6IElEaXNwb3NhYmxlW10pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkIG9mIGRpc3Bvc2FibGVzKSB7XG4gICAgZC5kaXNwb3NlKCk7XG4gIH1cbiAgZGlzcG9zYWJsZXMubGVuZ3RoID0gMDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGlzcG9zYWJsZSB0aGF0IHdpbGwgZGlzcG9zZSBvZiBhbiBhcnJheSBvZiBkaXNwb3NhYmxlcyB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcG9zZUFycmF5RGlzcG9zYWJsZShhcnJheTogSURpc3Bvc2FibGVbXSk6IElEaXNwb3NhYmxlIHtcbiAgcmV0dXJuIHsgZGlzcG9zZTogKCkgPT4gZGlzcG9zZUFycmF5KGFycmF5KSB9O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5leHBvcnQgY2xhc3MgVHdvS2V5TWFwPFRGaXJzdCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFNlY29uZCBleHRlbmRzIHN0cmluZyB8IG51bWJlciwgVFZhbHVlPiB7XG4gIHByaXZhdGUgX2RhdGE6IHsgW2JnOiBzdHJpbmcgfCBudW1iZXJdOiB7IFtmZzogc3RyaW5nIHwgbnVtYmVyXTogVFZhbHVlIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gIHB1YmxpYyBzZXQoZmlyc3Q6IFRGaXJzdCwgc2Vjb25kOiBUU2Vjb25kLCB2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhW2ZpcnN0XSkge1xuICAgICAgdGhpcy5fZGF0YVtmaXJzdF0gPSB7fTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVtmaXJzdCBhcyBzdHJpbmcgfCBudW1iZXJdIVtzZWNvbmRdID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCk6IFRWYWx1ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSA/IHRoaXMuX2RhdGFbZmlyc3QgYXMgc3RyaW5nIHwgbnVtYmVyXSFbc2Vjb25kXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhID0ge307XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEZvdXJLZXlNYXA8VEZpcnN0IGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUU2Vjb25kIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyLCBUVGhpcmQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRGb3VydGggZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIsIFRWYWx1ZT4ge1xuICBwcml2YXRlIF9kYXRhOiBUd29LZXlNYXA8VEZpcnN0LCBUU2Vjb25kLCBUd29LZXlNYXA8VFRoaXJkLCBURm91cnRoLCBUVmFsdWU+PiA9IG5ldyBUd29LZXlNYXAoKTtcblxuICBwdWJsaWMgc2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdGhpcmQ6IFRUaGlyZCwgZm91cnRoOiBURm91cnRoLCB2YWx1ZTogVFZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhLmdldChmaXJzdCwgc2Vjb25kKSkge1xuICAgICAgdGhpcy5fZGF0YS5zZXQoZmlyc3QsIHNlY29uZCwgbmV3IFR3b0tleU1hcCgpKTtcbiAgICB9XG4gICAgdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCkhLnNldCh0aGlyZCwgZm91cnRoLCB2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0KGZpcnN0OiBURmlyc3QsIHNlY29uZDogVFNlY29uZCwgdGhpcmQ6IFRUaGlyZCwgZm91cnRoOiBURm91cnRoKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXQoZmlyc3QsIHNlY29uZCk/LmdldCh0aGlyZCwgZm91cnRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9kYXRhLmNsZWFyKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW50ZXJmYWNlIElOYXZpZ2F0b3Ige1xuICB1c2VyQWdlbnQ6IHN0cmluZztcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbn1cblxuLy8gV2UncmUgZGVjbGFyaW5nIGEgbmF2aWdhdG9yIGdsb2JhbCBoZXJlIGFzIHdlIGV4cGVjdCBpdCBpbiBhbGwgcnVudGltZXMgKG5vZGUgYW5kIGJyb3dzZXIpLCBidXRcbi8vIHdlIHdhbnQgdGhpcyBtb2R1bGUgdG8gbGl2ZSBpbiBjb21tb24uXG5kZWNsYXJlIGNvbnN0IG5hdmlnYXRvcjogSU5hdmlnYXRvcjtcbmRlY2xhcmUgY29uc3QgcHJvY2VzczogdW5rbm93bjtcblxuZXhwb3J0IGNvbnN0IGlzTm9kZSA9ICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgJ3RpdGxlJyBpbiAocHJvY2VzcyBhcyBhbnkpKSA/IHRydWUgOiBmYWxzZTtcbmNvbnN0IHVzZXJBZ2VudCA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnVzZXJBZ2VudDtcbmNvbnN0IHBsYXRmb3JtID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IucGxhdGZvcm07XG5cbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSB1c2VyQWdlbnQuaW5jbHVkZXMoJ0ZpcmVmb3gnKTtcbmV4cG9ydCBjb25zdCBpc0xlZ2FjeUVkZ2UgPSB1c2VyQWdlbnQuaW5jbHVkZXMoJ0VkZ2UnKTtcbmV4cG9ydCBjb25zdCBpc1NhZmFyaSA9IC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QodXNlckFnZW50KTtcbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZhcmlWZXJzaW9uKCk6IG51bWJlciB7XG4gIGlmICghaXNTYWZhcmkpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBtYWpvclZlcnNpb24gPSB1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC8oXFxkKykvKTtcbiAgaWYgKG1ham9yVmVyc2lvbiA9PT0gbnVsbCB8fCBtYWpvclZlcnNpb24ubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiBwYXJzZUludChtYWpvclZlcnNpb25bMV0pO1xufVxuXG4vLyBGaW5kIHRoZSB1c2VycyBwbGF0Zm9ybS4gV2UgdXNlIHRoaXMgdG8gaW50ZXJwcmV0IHRoZSBtZXRhIGtleVxuLy8gYW5kIElTTyB0aGlyZCBsZXZlbCBzaGlmdHMuXG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xOTg3NzkyNC81Nzc1OThcbmV4cG9ydCBjb25zdCBpc01hYyA9IFsnTWFjaW50b3NoJywgJ01hY0ludGVsJywgJ01hY1BQQycsICdNYWM2OEsnXS5pbmNsdWRlcyhwbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNJcGFkID0gcGxhdGZvcm0gPT09ICdpUGFkJztcbmV4cG9ydCBjb25zdCBpc0lwaG9uZSA9IHBsYXRmb3JtID09PSAnaVBob25lJztcbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBbJ1dpbmRvd3MnLCAnV2luMTYnLCAnV2luMzInLCAnV2luQ0UnXS5pbmNsdWRlcyhwbGF0Zm9ybSk7XG5leHBvcnQgY29uc3QgaXNMaW51eCA9IHBsYXRmb3JtLmluZGV4T2YoJ0xpbnV4JykgPj0gMDtcbi8vIE5vdGUgdGhhdCB3aGVuIHRoaXMgaXMgdHJ1ZSwgaXNMaW51eCB3aWxsIGFsc28gYmUgdHJ1ZS5cbmV4cG9ydCBjb25zdCBpc0Nocm9tZU9TID0gL1xcYkNyT1NcXGIvLnRlc3QodXNlckFnZW50KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIyIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLy8gV29yayB2YXJpYWJsZXMgdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uLlxubGV0IGkgPSAwO1xuXG4vKipcbiAqIEEgZ2VuZXJpYyBsaXN0IHRoYXQgaXMgbWFpbnRhaW5lZCBpbiBzb3J0ZWQgb3JkZXIgYW5kIGFsbG93cyB2YWx1ZXMgd2l0aCBkdXBsaWNhdGUga2V5cy4gVGhpc1xuICogbGlzdCBpcyBiYXNlZCBvbiBiaW5hcnkgc2VhcmNoIGFuZCBhcyBzdWNoIGxvY2F0aW5nIGEga2V5IHdpbGwgdGFrZSBPKGxvZyBuKSBhbW9ydGl6ZWQsIHRoaXNcbiAqIGluY2x1ZGVzIHRoZSBieSBrZXkgaXRlcmF0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3J0ZWRMaXN0PFQ+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfYXJyYXk6IFRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2dldEtleTogKHZhbHVlOiBUKSA9PiBudW1iZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fYXJyYXkubGVuZ3RoID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnQodmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLl9hcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaSA9IHRoaXMuX3NlYXJjaCh0aGlzLl9nZXRLZXkodmFsdWUpKTtcbiAgICB0aGlzLl9hcnJheS5zcGxpY2UoaSwgMCwgdmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGRlbGV0ZSh2YWx1ZTogVCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0S2V5KHZhbHVlKTtcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaSA9IHRoaXMuX3NlYXJjaChrZXkpO1xuICAgIGlmIChpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSAhPT0ga2V5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRvIHtcbiAgICAgIGlmICh0aGlzLl9hcnJheVtpXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYXJyYXkuc3BsaWNlKGksIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kgPCB0aGlzLl9hcnJheS5sZW5ndGggJiYgdGhpcy5fZ2V0S2V5KHRoaXMuX2FycmF5W2ldKSA9PT0ga2V5KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgKmdldEtleUl0ZXJhdG9yKGtleTogbnVtYmVyKTogSXRlcmFibGVJdGVyYXRvcjxUPiB7XG4gICAgaWYgKHRoaXMuX2FycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpID0gdGhpcy5fc2VhcmNoKGtleSk7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pICE9PSBrZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG8ge1xuICAgICAgeWllbGQgdGhpcy5fYXJyYXlbaV07XG4gICAgfSB3aGlsZSAoKytpIDwgdGhpcy5fYXJyYXkubGVuZ3RoICYmIHRoaXMuX2dldEtleSh0aGlzLl9hcnJheVtpXSkgPT09IGtleSk7XG4gIH1cblxuICBwdWJsaWMgZm9yRWFjaEJ5S2V5KGtleTogbnVtYmVyLCBjYWxsYmFjazogKHZhbHVlOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2FycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpID0gdGhpcy5fc2VhcmNoKGtleSk7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gdGhpcy5fYXJyYXkubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pICE9PSBrZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZG8ge1xuICAgICAgY2FsbGJhY2sodGhpcy5fYXJyYXlbaV0pO1xuICAgIH0gd2hpbGUgKCsraSA8IHRoaXMuX2FycmF5Lmxlbmd0aCAmJiB0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbaV0pID09PSBrZXkpO1xuICB9XG5cbiAgcHVibGljIHZhbHVlcygpOiBJdGVyYWJsZUl0ZXJhdG9yPFQ+IHtcbiAgICAvLyBEdXBsaWNhdGUgdGhlIGFycmF5IHRvIGF2b2lkIGlzc3VlcyB3aGVuIF9hcnJheSBjaGFuZ2VzIHdoaWxlIGl0ZXJhdGluZ1xuICAgIHJldHVybiBbLi4udGhpcy5fYXJyYXldLnZhbHVlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VhcmNoKGtleTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgbWluID0gMDtcbiAgICBsZXQgbWF4ID0gdGhpcy5fYXJyYXkubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAobWF4ID49IG1pbikge1xuICAgICAgbGV0IG1pZCA9IChtaW4gKyBtYXgpID4+IDE7XG4gICAgICBjb25zdCBtaWRLZXkgPSB0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbbWlkXSk7XG4gICAgICBpZiAobWlkS2V5ID4ga2V5KSB7XG4gICAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgICB9IGVsc2UgaWYgKG1pZEtleSA8IGtleSkge1xuICAgICAgICBtaW4gPSBtaWQgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8ga2V5IGluIGxpc3QsIHdhbGsgdG8gbG93ZXN0IGR1cGxpY2F0ZVxuICAgICAgICB3aGlsZSAobWlkID4gMCAmJiB0aGlzLl9nZXRLZXkodGhpcy5fYXJyYXlbbWlkIC0gMV0pID09PSBrZXkpIHtcbiAgICAgICAgICBtaWQtLTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBrZXkgbm90IGluIGxpc3RcbiAgICAvLyBzdGlsbCByZXR1cm4gY2xvc2VzdCBtaW4gKGFsc28gdXNlZCBhcyBpbnNlcnQgcG9zaXRpb24pXG4gICAgcmV0dXJuIG1pbjtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuXG5pbnRlcmZhY2UgSVRhc2tRdWV1ZSB7XG4gIC8qKlxuICAgKiBBZGRzIGEgdGFzayB0byB0aGUgcXVldWUgd2hpY2ggd2lsbCBydW4gaW4gYSBmdXR1cmUgaWRsZSBjYWxsYmFjay5cbiAgICogVG8gYXZvaWQgcGVyY2VpdmFibGUgc3RhbGxzIG9uIHRoZSBtYWludGhyZWFkLCB0YXNrcyB3aXRoIGhlYXZ5IHdvcmtsb2FkXG4gICAqIHNob3VsZCBzcGxpdCB0aGVpciB3b3JrIGludG8gc21hbGxlciBwaWVjZXMgYW5kIHJldHVybiBgdHJ1ZWAgdG8gZ2V0XG4gICAqIGNhbGxlZCBhZ2FpbiB1bnRpbCB0aGUgd29yayBpcyBkb25lIChvbiBmYWxzeSByZXR1cm4gdmFsdWUpLlxuICAgKi9cbiAgZW5xdWV1ZSh0YXNrOiAoKSA9PiBib29sZWFuIHwgdm9pZCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhlIHF1ZXVlLCBydW5uaW5nIGFsbCByZW1haW5pbmcgdGFza3Mgc3luY2hyb25vdXNseS5cbiAgICovXG4gIGZsdXNoKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbnkgcmVtYWluaW5nIHRhc2tzIGZyb20gdGhlIHF1ZXVlLCB0aGVzZSB3aWxsIG5vdCBiZSBydW4uXG4gICAqL1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVRhc2tEZWFkbGluZSB7XG4gIHRpbWVSZW1haW5pbmcoKTogbnVtYmVyO1xufVxudHlwZSBDYWxsYmFja1dpdGhEZWFkbGluZSA9IChkZWFkbGluZTogSVRhc2tEZWFkbGluZSkgPT4gdm9pZDtcblxuYWJzdHJhY3QgY2xhc3MgVGFza1F1ZXVlIGltcGxlbWVudHMgSVRhc2tRdWV1ZSB7XG4gIHByaXZhdGUgX3Rhc2tzOiAoKCkgPT4gYm9vbGVhbiB8IHZvaWQpW10gPSBbXTtcbiAgcHJpdmF0ZSBfaWRsZUNhbGxiYWNrPzogbnVtYmVyO1xuICBwcml2YXRlIF9pID0gMDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogQ2FsbGJhY2tXaXRoRGVhZGxpbmUpOiBudW1iZXI7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBfY2FuY2VsQ2FsbGJhY2soaWRlbnRpZmllcjogbnVtYmVyKTogdm9pZDtcblxuICBwdWJsaWMgZW5xdWV1ZSh0YXNrOiAoKSA9PiBib29sZWFuIHwgdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3Rhc2tzLnB1c2godGFzayk7XG4gICAgdGhpcy5fc3RhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpOiB2b2lkIHtcbiAgICB3aGlsZSAodGhpcy5faSA8IHRoaXMuX3Rhc2tzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLl90YXNrc1t0aGlzLl9pXSgpKSB7XG4gICAgICAgIHRoaXMuX2krKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pZGxlQ2FsbGJhY2spIHtcbiAgICAgIHRoaXMuX2NhbmNlbENhbGxiYWNrKHRoaXMuX2lkbGVDYWxsYmFjayk7XG4gICAgICB0aGlzLl9pZGxlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuX2kgPSAwO1xuICAgIHRoaXMuX3Rhc2tzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwcml2YXRlIF9zdGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lkbGVDYWxsYmFjaykge1xuICAgICAgdGhpcy5faWRsZUNhbGxiYWNrID0gdGhpcy5fcmVxdWVzdENhbGxiYWNrKHRoaXMuX3Byb2Nlc3MuYmluZCh0aGlzKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2VzcyhkZWFkbGluZTogSVRhc2tEZWFkbGluZSk6IHZvaWQge1xuICAgIHRoaXMuX2lkbGVDYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICBsZXQgdGFza0R1cmF0aW9uID0gMDtcbiAgICBsZXQgbG9uZ2VzdFRhc2sgPSAwO1xuICAgIGxldCBsYXN0RGVhZGxpbmVSZW1haW5pbmcgPSBkZWFkbGluZS50aW1lUmVtYWluaW5nKCk7XG4gICAgbGV0IGRlYWRsaW5lUmVtYWluaW5nID0gMDtcbiAgICB3aGlsZSAodGhpcy5faSA8IHRoaXMuX3Rhc2tzLmxlbmd0aCkge1xuICAgICAgdGFza0R1cmF0aW9uID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICghdGhpcy5fdGFza3NbdGhpcy5faV0oKSkge1xuICAgICAgICB0aGlzLl9pKys7XG4gICAgICB9XG4gICAgICAvLyBvdGhlciB0aGFuIHBlcmZvcm1hbmNlLm5vdywgRGF0ZS5ub3cgbWlnaHQgbm90IGJlIHN0YWJsZSAoY2hhbmdlcyBvbiB3YWxsIGNsb2NrIGNoYW5nZXMpLFxuICAgICAgLy8gdGhpcyBpcyBub3QgYW4gaXNzdWUgaGVyZSBhcyBhIGNsb2NrIGNoYW5nZSBkdXJpbmcgYSBzaG9ydCBydW5uaW5nIHRhc2sgaXMgdmVyeSB1bmxpa2VseVxuICAgICAgLy8gaW4gY2FzZSBpdCBzdGlsbCBoYXBwZW5lZCBhbmQgbGVhZHMgdG8gbmVnYXRpdmUgZHVyYXRpb24sIHNpbXBseSBhc3N1bWUgMSBtc2VjXG4gICAgICB0YXNrRHVyYXRpb24gPSBNYXRoLm1heCgxLCBEYXRlLm5vdygpIC0gdGFza0R1cmF0aW9uKTtcbiAgICAgIGxvbmdlc3RUYXNrID0gTWF0aC5tYXgodGFza0R1cmF0aW9uLCBsb25nZXN0VGFzayk7XG4gICAgICAvLyBHdWVzcyB0aGUgZm9sbG93aW5nIHRhc2sgd2lsbCB0YWtlIGEgc2ltaWxhciB0aW1lIHRvIHRoZSBsb25nZXN0IHRhc2sgaW4gdGhpcyBiYXRjaCwgYWxsb3dcbiAgICAgIC8vIGFkZGl0aW9uYWwgcm9vbSB0byB0cnkgYXZvaWQgZXhjZWVkaW5nIHRoZSBkZWFkbGluZVxuICAgICAgZGVhZGxpbmVSZW1haW5pbmcgPSBkZWFkbGluZS50aW1lUmVtYWluaW5nKCk7XG4gICAgICBpZiAobG9uZ2VzdFRhc2sgKiAxLjUgPiBkZWFkbGluZVJlbWFpbmluZykge1xuICAgICAgICAvLyBXYXJuIHdoZW4gdGhlIHRpbWUgZXhjZWVkaW5nIHRoZSBkZWFkbGluZSBpcyBvdmVyIDIwbXMsIGlmIHRoaXMgaGFwcGVucyBpbiBwcmFjdGljZSB0aGVcbiAgICAgICAgLy8gdGFzayBzaG91bGQgYmUgc3BsaXQgaW50byBzdWItdGFza3MgdG8gZW5zdXJlIHRoZSBVSSByZW1haW5zIHJlc3BvbnNpdmUuXG4gICAgICAgIGlmIChsYXN0RGVhZGxpbmVSZW1haW5pbmcgLSB0YXNrRHVyYXRpb24gPCAtMjApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYHRhc2sgcXVldWUgZXhjZWVkZWQgYWxsb3R0ZWQgZGVhZGxpbmUgYnkgJHtNYXRoLmFicyhNYXRoLnJvdW5kKGxhc3REZWFkbGluZVJlbWFpbmluZyAtIHRhc2tEdXJhdGlvbikpfW1zYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFzdERlYWRsaW5lUmVtYWluaW5nID0gZGVhZGxpbmVSZW1haW5pbmc7XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIEEgcXVldWUgb2YgdGhhdCBydW5zIHRhc2tzIG92ZXIgc2V2ZXJhbCB0YXNrcyB2aWEgc2V0VGltZW91dCwgdHJ5aW5nIHRvIG1haW50YWluIGFib3ZlIDYwIGZyYW1lc1xuICogcGVyIHNlY29uZC4gVGhlIHRhc2tzIHdpbGwgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnF1ZXVlZCwgYnV0IHRoZXkgd2lsbCBydW4gc29tZSB0aW1lIGxhdGVyLFxuICogYW5kIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGV5J3JlIG5vbi11cmdlbnQgYW5kIHdpbGwgbm90IGludHJvZHVjZSByYWNlIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmlvcml0eVRhc2tRdWV1ZSBleHRlbmRzIFRhc2tRdWV1ZSB7XG4gIHByb3RlY3RlZCBfcmVxdWVzdENhbGxiYWNrKGNhbGxiYWNrOiBDYWxsYmFja1dpdGhEZWFkbGluZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2sodGhpcy5fY3JlYXRlRGVhZGxpbmUoMTYpKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2NhbmNlbENhbGxiYWNrKGlkZW50aWZpZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURlYWRsaW5lKGR1cmF0aW9uOiBudW1iZXIpOiBJVGFza0RlYWRsaW5lIHtcbiAgICBjb25zdCBlbmQgPSBEYXRlLm5vdygpICsgZHVyYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpbWVSZW1haW5pbmc6ICgpID0+IE1hdGgubWF4KDAsIGVuZCAtIERhdGUubm93KCkpXG4gICAgfTtcbiAgfVxufVxuXG5jbGFzcyBJZGxlVGFza1F1ZXVlSW50ZXJuYWwgZXh0ZW5kcyBUYXNrUXVldWUge1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RDYWxsYmFjayhjYWxsYmFjazogSWRsZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlcXVlc3RJZGxlQ2FsbGJhY2soY2FsbGJhY2spO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9jYW5jZWxDYWxsYmFjayhpZGVudGlmaWVyOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjYW5jZWxJZGxlQ2FsbGJhY2soaWRlbnRpZmllcik7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHF1ZXVlIG9mIHRoYXQgcnVucyB0YXNrcyBvdmVyIHNldmVyYWwgaWRsZSBjYWxsYmFja3MsIHRyeWluZyB0byByZXNwZWN0IHRoZSBpZGxlIGNhbGxiYWNrJ3NcbiAqIGRlYWRsaW5lIGdpdmVuIGJ5IHRoZSBlbnZpcm9ubWVudC4gVGhlIHRhc2tzIHdpbGwgcnVuIGluIHRoZSBvcmRlciB0aGV5IGFyZSBlbnF1ZXVlZCwgYnV0IHRoZXlcbiAqIHdpbGwgcnVuIHNvbWUgdGltZSBsYXRlciwgYW5kIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIGVuc3VyZSB0aGV5J3JlIG5vbi11cmdlbnQgYW5kIHdpbGwgbm90XG4gKiBpbnRyb2R1Y2UgcmFjZSBjb25kaXRpb25zLlxuICpcbiAqIFRoaXMgcmV2ZXJ0cyB0byBhIHtAbGluayBQcmlvcml0eVRhc2tRdWV1ZX0gaWYgdGhlIGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgaWRsZSBjYWxsYmFja3MuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbmV4cG9ydCBjb25zdCBJZGxlVGFza1F1ZXVlID0gKCFpc05vZGUgJiYgJ3JlcXVlc3RJZGxlQ2FsbGJhY2snIGluIHdpbmRvdykgPyBJZGxlVGFza1F1ZXVlSW50ZXJuYWwgOiBQcmlvcml0eVRhc2tRdWV1ZTtcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCB0cmFja3MgYSBzaW5nbGUgZGVib3VuY2VkIHRhc2sgdGhhdCB3aWxsIHJ1biBvbiB0aGUgbmV4dCBpZGxlIGZyYW1lLiBXaGVuIGNhbGxlZFxuICogbXVsdGlwbGUgdGltZXMsIG9ubHkgdGhlIGxhc3Qgc2V0IHRhc2sgd2lsbCBydW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWJvdW5jZWRJZGxlVGFzayB7XG4gIHByaXZhdGUgX3F1ZXVlOiBJVGFza1F1ZXVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3F1ZXVlID0gbmV3IElkbGVUYXNrUXVldWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQodGFzazogKCkgPT4gYm9vbGVhbiB8IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9xdWV1ZS5jbGVhcigpO1xuICAgIHRoaXMuX3F1ZXVlLmVucXVldWUodGFzayk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgdGhpcy5fcXVldWUuZmx1c2goKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDSEFSX0RBVEFfQ09ERV9JTkRFWCwgTlVMTF9DRUxMX0NPREUsIFdISVRFU1BBQ0VfQ0VMTF9DT0RFIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlV2luZG93c01vZGVXcmFwcGVkU3RhdGUoYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2UpOiB2b2lkIHtcbiAgLy8gV2lucHR5IGRvZXMgbm90IHN1cHBvcnQgd3JhcGFyb3VuZCBtb2RlIHdoaWNoIG1lYW5zIHRoYXQgbGluZXMgd2lsbCBuZXZlclxuICAvLyBiZSBtYXJrZWQgYXMgd3JhcHBlZC4gVGhpcyBjYXVzZXMgaXNzdWVzIGZvciB0aGluZ3MgbGlrZSBjb3B5aW5nIGEgbGluZVxuICAvLyByZXRhaW5pbmcgdGhlIHdyYXBwZWQgbmV3IGxpbmUgY2hhcmFjdGVycyBvciBpZiBjb25zdW1lcnMgYXJlIGxpc3RlbmluZ1xuICAvLyBpbiBvbiB0aGUgZGF0YSBzdHJlYW0uXG4gIC8vXG4gIC8vIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGlzIHRvIGxpc3RlbiB0byBldmVyeSBpbmNvbWluZyBsaW5lIGZlZWQgYW5kIG1hcmtcbiAgLy8gdGhlIGxpbmUgYXMgd3JhcHBlZCBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHByZXZpb3VzIGxpbmUgaXMgbm90IGFcbiAgLy8gc3BhY2UuIFRoaXMgaXMgY2VydGFpbmx5IG5vdCB3aXRob3V0IGl0cyBwcm9ibGVtcywgYnV0IGdlbmVyYWxseSBvblxuICAvLyBXaW5kb3dzIHdoZW4gdGV4dCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHRlcm1pbmFsIGl0J3MgbGlrZWx5IGdvaW5nIHRvIGJlXG4gIC8vIHdyYXBwZWQuXG4gIGNvbnN0IGxpbmUgPSBidWZmZXJTZXJ2aWNlLmJ1ZmZlci5saW5lcy5nZXQoYnVmZmVyU2VydmljZS5idWZmZXIueWJhc2UgKyBidWZmZXJTZXJ2aWNlLmJ1ZmZlci55IC0gMSk7XG4gIGNvbnN0IGxhc3RDaGFyID0gbGluZT8uZ2V0KGJ1ZmZlclNlcnZpY2UuY29scyAtIDEpO1xuXG4gIGNvbnN0IG5leHRMaW5lID0gYnVmZmVyU2VydmljZS5idWZmZXIubGluZXMuZ2V0KGJ1ZmZlclNlcnZpY2UuYnVmZmVyLnliYXNlICsgYnVmZmVyU2VydmljZS5idWZmZXIueSk7XG4gIGlmIChuZXh0TGluZSAmJiBsYXN0Q2hhcikge1xuICAgIG5leHRMaW5lLmlzV3JhcHBlZCA9IChsYXN0Q2hhcltDSEFSX0RBVEFfQ09ERV9JTkRFWF0gIT09IE5VTExfQ0VMTF9DT0RFICYmIGxhc3RDaGFyW0NIQVJfREFUQV9DT0RFX0lOREVYXSAhPT0gV0hJVEVTUEFDRV9DRUxMX0NPREUpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOCBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQ29sb3JSR0IsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEZnRmxhZ3MsIEJnRmxhZ3MsIFVuZGVybGluZVN0eWxlLCBFeHRGbGFncyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZURhdGEgaW1wbGVtZW50cyBJQXR0cmlidXRlRGF0YSB7XG4gIHB1YmxpYyBzdGF0aWMgdG9Db2xvclJHQih2YWx1ZTogbnVtYmVyKTogSUNvbG9yUkdCIHtcbiAgICByZXR1cm4gW1xuICAgICAgdmFsdWUgPj4+IEF0dHJpYnV0ZXMuUkVEX1NISUZUICYgMjU1LFxuICAgICAgdmFsdWUgPj4+IEF0dHJpYnV0ZXMuR1JFRU5fU0hJRlQgJiAyNTUsXG4gICAgICB2YWx1ZSAmIDI1NVxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21Db2xvclJHQih2YWx1ZTogSUNvbG9yUkdCKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHZhbHVlWzBdICYgMjU1KSA8PCBBdHRyaWJ1dGVzLlJFRF9TSElGVCB8ICh2YWx1ZVsxXSAmIDI1NSkgPDwgQXR0cmlidXRlcy5HUkVFTl9TSElGVCB8IHZhbHVlWzJdICYgMjU1O1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IElBdHRyaWJ1dGVEYXRhIHtcbiAgICBjb25zdCBuZXdPYmogPSBuZXcgQXR0cmlidXRlRGF0YSgpO1xuICAgIG5ld09iai5mZyA9IHRoaXMuZmc7XG4gICAgbmV3T2JqLmJnID0gdGhpcy5iZztcbiAgICBuZXdPYmouZXh0ZW5kZWQgPSB0aGlzLmV4dGVuZGVkLmNsb25lKCk7XG4gICAgcmV0dXJuIG5ld09iajtcbiAgfVxuXG4gIC8vIGRhdGFcbiAgcHVibGljIGZnID0gMDtcbiAgcHVibGljIGJnID0gMDtcbiAgcHVibGljIGV4dGVuZGVkOiBJRXh0ZW5kZWRBdHRycyA9IG5ldyBFeHRlbmRlZEF0dHJzKCk7XG5cbiAgLy8gZmxhZ3NcbiAgcHVibGljIGlzSW52ZXJzZSgpOiBudW1iZXIgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuSU5WRVJTRTsgfVxuICBwdWJsaWMgaXNCb2xkKCk6IG51bWJlciAgICAgICAgICB7IHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5CT0xEOyB9XG4gIHB1YmxpYyBpc1VuZGVybGluZSgpOiBudW1iZXIgICAgIHtcbiAgICBpZiAodGhpcy5oYXNFeHRlbmRlZEF0dHJzKCkgJiYgdGhpcy5leHRlbmRlZC51bmRlcmxpbmVTdHlsZSAhPT0gVW5kZXJsaW5lU3R5bGUuTk9ORSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZnICYgRmdGbGFncy5VTkRFUkxJTkU7XG4gIH1cbiAgcHVibGljIGlzQmxpbmsoKTogbnVtYmVyICAgICAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuQkxJTks7IH1cbiAgcHVibGljIGlzSW52aXNpYmxlKCk6IG51bWJlciAgICAgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuSU5WSVNJQkxFOyB9XG4gIHB1YmxpYyBpc0l0YWxpYygpOiBudW1iZXIgICAgICAgIHsgcmV0dXJuIHRoaXMuYmcgJiBCZ0ZsYWdzLklUQUxJQzsgfVxuICBwdWJsaWMgaXNEaW0oKTogbnVtYmVyICAgICAgICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5ESU07IH1cbiAgcHVibGljIGlzU3RyaWtldGhyb3VnaCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuU1RSSUtFVEhST1VHSDsgfVxuICBwdWJsaWMgaXNQcm90ZWN0ZWQoKTogbnVtYmVyICAgICB7IHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5QUk9URUNURUQ7IH1cbiAgcHVibGljIGlzT3ZlcmxpbmUoKTogbnVtYmVyICAgICAgeyByZXR1cm4gdGhpcy5iZyAmIEJnRmxhZ3MuT1ZFUkxJTkU7IH1cblxuICAvLyBjb2xvciBtb2Rlc1xuICBwdWJsaWMgZ2V0RmdDb2xvck1vZGUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0s7IH1cbiAgcHVibGljIGdldEJnQ29sb3JNb2RlKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLOyB9XG4gIHB1YmxpYyBpc0ZnUkdCKCk6IGJvb2xlYW4gICAgICAgeyByZXR1cm4gKHRoaXMuZmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1JHQjsgfVxuICBwdWJsaWMgaXNCZ1JHQigpOiBib29sZWFuICAgICAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9SR0I7IH1cbiAgcHVibGljIGlzRmdQYWxldHRlKCk6IGJvb2xlYW4gICB7IHJldHVybiAodGhpcy5mZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDE2IHx8ICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2OyB9XG4gIHB1YmxpYyBpc0JnUGFsZXR0ZSgpOiBib29sZWFuICAgeyByZXR1cm4gKHRoaXMuYmcgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNiB8fCAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUDI1NjsgfVxuICBwdWJsaWMgaXNGZ0RlZmF1bHQoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMDsgfVxuICBwdWJsaWMgaXNCZ0RlZmF1bHQoKTogYm9vbGVhbiAgIHsgcmV0dXJuICh0aGlzLmJnICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMDsgfVxuICBwdWJsaWMgaXNBdHRyaWJ1dGVEZWZhdWx0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5mZyA9PT0gMCAmJiB0aGlzLmJnID09PSAwOyB9XG5cbiAgLy8gY29sb3JzXG4gIHB1YmxpYyBnZXRGZ0NvbG9yKCk6IG51bWJlciB7XG4gICAgc3dpdGNoICh0aGlzLmZnICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUDE2OlxuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AyNTY6ICByZXR1cm4gdGhpcy5mZyAmIEF0dHJpYnV0ZXMuUENPTE9SX01BU0s7XG4gICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmZnICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAgLy8gQ01fREVGQVVMVCBkZWZhdWx0cyB0byAtMVxuICAgIH1cbiAgfVxuICBwdWJsaWMgZ2V0QmdDb2xvcigpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5iZyAmIEF0dHJpYnV0ZXMuQ01fTUFTSykge1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1AxNjpcbiAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuYmcgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgY2FzZSBBdHRyaWJ1dGVzLkNNX1JHQjogICByZXR1cm4gdGhpcy5iZyAmIEF0dHJpYnV0ZXMuUkdCX01BU0s7XG4gICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIENNX0RFRkFVTFQgZGVmYXVsdHMgdG8gLTFcbiAgICB9XG4gIH1cblxuICAvLyBleHRlbmRlZCBhdHRyc1xuICBwdWJsaWMgaGFzRXh0ZW5kZWRBdHRycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gIH1cbiAgcHVibGljIHVwZGF0ZUV4dGVuZGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4dGVuZGVkLmlzRW1wdHkoKSkge1xuICAgICAgdGhpcy5iZyAmPSB+QmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmcgfD0gQmdGbGFncy5IQVNfRVhURU5ERUQ7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVDb2xvcigpOiBudW1iZXIge1xuICAgIGlmICgodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvcikge1xuICAgICAgc3dpdGNoICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSB7XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMTY6XG4gICAgICAgIGNhc2UgQXR0cmlidXRlcy5DTV9QMjU2OiAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLlBDT0xPUl9NQVNLO1xuICAgICAgICBjYXNlIEF0dHJpYnV0ZXMuQ01fUkdCOiAgIHJldHVybiB0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5SR0JfTUFTSztcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGZ0NvbG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldEZnQ29sb3IoKTtcbiAgfVxuICBwdWJsaWMgZ2V0VW5kZXJsaW5lQ29sb3JNb2RlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/IHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0tcbiAgICAgIDogdGhpcy5nZXRGZ0NvbG9yTW9kZSgpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yUkdCKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSAmJiB+dGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvclxuICAgICAgPyAodGhpcy5leHRlbmRlZC51bmRlcmxpbmVDb2xvciAmIEF0dHJpYnV0ZXMuQ01fTUFTSykgPT09IEF0dHJpYnV0ZXMuQ01fUkdCXG4gICAgICA6IHRoaXMuaXNGZ1JHQigpO1xuICB9XG4gIHB1YmxpYyBpc1VuZGVybGluZUNvbG9yUGFsZXR0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkgJiYgfnRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3JcbiAgICAgID8gKHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lQ29sb3IgJiBBdHRyaWJ1dGVzLkNNX01BU0spID09PSBBdHRyaWJ1dGVzLkNNX1AxNlxuICAgICAgICAgIHx8ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gQXR0cmlidXRlcy5DTV9QMjU2XG4gICAgICA6IHRoaXMuaXNGZ1BhbGV0dGUoKTtcbiAgfVxuICBwdWJsaWMgaXNVbmRlcmxpbmVDb2xvckRlZmF1bHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQpICYmIH50aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yXG4gICAgICA/ICh0aGlzLmV4dGVuZGVkLnVuZGVybGluZUNvbG9yICYgQXR0cmlidXRlcy5DTV9NQVNLKSA9PT0gMFxuICAgICAgOiB0aGlzLmlzRmdEZWZhdWx0KCk7XG4gIH1cbiAgcHVibGljIGdldFVuZGVybGluZVN0eWxlKCk6IFVuZGVybGluZVN0eWxlIHtcbiAgICByZXR1cm4gdGhpcy5mZyAmIEZnRmxhZ3MuVU5ERVJMSU5FXG4gICAgICA/ICh0aGlzLmJnICYgQmdGbGFncy5IQVNfRVhURU5ERUQgPyB0aGlzLmV4dGVuZGVkLnVuZGVybGluZVN0eWxlIDogVW5kZXJsaW5lU3R5bGUuU0lOR0xFKVxuICAgICAgOiBVbmRlcmxpbmVTdHlsZS5OT05FO1xuICB9XG4gIHB1YmxpYyBnZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5kZWQudW5kZXJsaW5lVmFyaWFudE9mZnNldDtcbiAgfVxufVxuXG5cbi8qKlxuICogRXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgYSBjZWxsLlxuICogSG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgZGlmZmVyZW50IHVuZGVybGluZSBzdHlsZXMgYW5kIGNvbG9yLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5kZWRBdHRycyBpbXBsZW1lbnRzIElFeHRlbmRlZEF0dHJzIHtcbiAgcHJpdmF0ZSBfZXh0OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgZ2V0IGV4dCgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLl91cmxJZCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuX2V4dCAmIH5FeHRGbGFncy5VTkRFUkxJTkVfU1RZTEUpIHxcbiAgICAgICAgKHRoaXMudW5kZXJsaW5lU3R5bGUgPDwgMjYpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZXh0O1xuICB9XG4gIHB1YmxpYyBzZXQgZXh0KHZhbHVlOiBudW1iZXIpIHsgdGhpcy5fZXh0ID0gdmFsdWU7IH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZVN0eWxlKCk6IFVuZGVybGluZVN0eWxlIHtcbiAgICAvLyBBbHdheXMgcmV0dXJuIHRoZSBVUkwgc3R5bGUgaWYgaXQgaGFzIG9uZVxuICAgIGlmICh0aGlzLl91cmxJZCkge1xuICAgICAgcmV0dXJuIFVuZGVybGluZVN0eWxlLkRBU0hFRDtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLl9leHQgJiBFeHRGbGFncy5VTkRFUkxJTkVfU1RZTEUpID4+IDI2O1xuICB9XG4gIHB1YmxpYyBzZXQgdW5kZXJsaW5lU3R5bGUodmFsdWU6IFVuZGVybGluZVN0eWxlKSB7XG4gICAgdGhpcy5fZXh0ICY9IH5FeHRGbGFncy5VTkRFUkxJTkVfU1RZTEU7XG4gICAgdGhpcy5fZXh0IHw9ICh2YWx1ZSA8PCAyNikgJiBFeHRGbGFncy5VTkRFUkxJTkVfU1RZTEU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVuZGVybGluZUNvbG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V4dCAmIChBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgfVxuICBwdWJsaWMgc2V0IHVuZGVybGluZUNvbG9yKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leHQgJj0gfihBdHRyaWJ1dGVzLkNNX01BU0sgfCBBdHRyaWJ1dGVzLlJHQl9NQVNLKTtcbiAgICB0aGlzLl9leHQgfD0gdmFsdWUgJiAoQXR0cmlidXRlcy5DTV9NQVNLIHwgQXR0cmlidXRlcy5SR0JfTUFTSyk7XG4gIH1cblxuICBwcml2YXRlIF91cmxJZDogbnVtYmVyID0gMDtcbiAgcHVibGljIGdldCB1cmxJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl91cmxJZDtcbiAgfVxuICBwdWJsaWMgc2V0IHVybElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl91cmxJZCA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KCk6IG51bWJlciB7XG4gICAgY29uc3QgdmFsID0gKHRoaXMuX2V4dCAmIEV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUKSA+PiAyOTtcbiAgICBpZiAodmFsIDwgMCkge1xuICAgICAgcmV0dXJuIHZhbCBeIDB4RkZGRkZGRjg7XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbiAgcHVibGljIHNldCB1bmRlcmxpbmVWYXJpYW50T2Zmc2V0KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9leHQgJj0gfkV4dEZsYWdzLlZBUklBTlRfT0ZGU0VUO1xuICAgIHRoaXMuX2V4dCB8PSAodmFsdWUgPDwgMjkpICYgRXh0RmxhZ3MuVkFSSUFOVF9PRkZTRVQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBleHQ6IG51bWJlciA9IDAsXG4gICAgdXJsSWQ6IG51bWJlciA9IDBcbiAgKSB7XG4gICAgdGhpcy5fZXh0ID0gZXh0O1xuICAgIHRoaXMuX3VybElkID0gdXJsSWQ7XG4gIH1cblxuICBwdWJsaWMgY2xvbmUoKTogSUV4dGVuZGVkQXR0cnMge1xuICAgIHJldHVybiBuZXcgRXh0ZW5kZWRBdHRycyh0aGlzLl9leHQsIHRoaXMuX3VybElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvYmplY3QgaG9sZHMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbixcbiAgICogdGhhdCBuZWVkcyB0byBiZSBwZXJzaXN0YW50IGluIHRoZSBidWZmZXIuXG4gICAqL1xuICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmRlcmxpbmVTdHlsZSA9PT0gVW5kZXJsaW5lU3R5bGUuTk9ORSAmJiB0aGlzLl91cmxJZCA9PT0gMDtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDaXJjdWxhckxpc3QsIElJbnNlcnRFdmVudCB9IGZyb20gJ2NvbW1vbi9DaXJjdWxhckxpc3QnO1xuaW1wb3J0IHsgSWRsZVRhc2tRdWV1ZSB9IGZyb20gJ2NvbW1vbi9UYXNrUXVldWUnO1xuaW1wb3J0IHsgSUF0dHJpYnV0ZURhdGEsIElCdWZmZXJMaW5lLCBJQ2VsbERhdGEsIElDaGFyc2V0IH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEV4dGVuZGVkQXR0cnMgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgQnVmZmVyTGluZSwgREVGQVVMVF9BVFRSX0RBVEEgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlckxpbmUnO1xuaW1wb3J0IHsgZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoLCByZWZsb3dMYXJnZXJBcHBseU5ld0xheW91dCwgcmVmbG93TGFyZ2VyQ3JlYXRlTmV3TGF5b3V0LCByZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlLCByZWZsb3dTbWFsbGVyR2V0TmV3TGluZUxlbmd0aHMgfSBmcm9tICdjb21tb24vYnVmZmVyL0J1ZmZlclJlZmxvdyc7XG5pbXBvcnQgeyBDZWxsRGF0YSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQ2VsbERhdGEnO1xuaW1wb3J0IHsgTlVMTF9DRUxMX0NIQVIsIE5VTExfQ0VMTF9DT0RFLCBOVUxMX0NFTExfV0lEVEgsIFdISVRFU1BBQ0VfQ0VMTF9DSEFSLCBXSElURVNQQUNFX0NFTExfQ09ERSwgV0hJVEVTUEFDRV9DRUxMX1dJRFRIIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgTWFya2VyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9NYXJrZXInO1xuaW1wb3J0IHsgSUJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9DSEFSU0VUIH0gZnJvbSAnY29tbW9uL2RhdGEvQ2hhcnNldHMnO1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElPcHRpb25zU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBjb25zdCBNQVhfQlVGRkVSX1NJWkUgPSA0Mjk0OTY3Mjk1OyAvLyAyXjMyIC0gMVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRlcm1pbmFsIGJ1ZmZlciAoYW4gaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHRlcm1pbmFsKSwgd2hlcmUgdGhlXG4gKiBmb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIChpbiBoaWdoLWxldmVsKTpcbiAqICAgLSB0ZXh0IGNvbnRlbnQgb2YgdGhpcyBwYXJ0aWN1bGFyIGJ1ZmZlclxuICogICAtIGN1cnNvciBwb3NpdGlvblxuICogICAtIHNjcm9sbCBwb3NpdGlvblxuICovXG5leHBvcnQgY2xhc3MgQnVmZmVyIGltcGxlbWVudHMgSUJ1ZmZlciB7XG4gIHB1YmxpYyBsaW5lczogQ2lyY3VsYXJMaXN0PElCdWZmZXJMaW5lPjtcbiAgcHVibGljIHlkaXNwOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgeWJhc2U6IG51bWJlciA9IDA7XG4gIHB1YmxpYyB5OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgeDogbnVtYmVyID0gMDtcbiAgcHVibGljIHNjcm9sbEJvdHRvbTogbnVtYmVyO1xuICBwdWJsaWMgc2Nyb2xsVG9wOiBudW1iZXI7XG4gIHB1YmxpYyB0YWJzOiB7IFtjb2x1bW46IG51bWJlcl06IGJvb2xlYW4gfCB1bmRlZmluZWQgfSA9IHt9O1xuICBwdWJsaWMgc2F2ZWRZOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgc2F2ZWRYOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgc2F2ZWRDdXJBdHRyRGF0YSA9IERFRkFVTFRfQVRUUl9EQVRBLmNsb25lKCk7XG4gIHB1YmxpYyBzYXZlZENoYXJzZXQ6IElDaGFyc2V0IHwgdW5kZWZpbmVkID0gREVGQVVMVF9DSEFSU0VUO1xuICBwdWJsaWMgbWFya2VyczogTWFya2VyW10gPSBbXTtcbiAgcHJpdmF0ZSBfbnVsbENlbGw6IElDZWxsRGF0YSA9IENlbGxEYXRhLmZyb21DaGFyRGF0YShbMCwgTlVMTF9DRUxMX0NIQVIsIE5VTExfQ0VMTF9XSURUSCwgTlVMTF9DRUxMX0NPREVdKTtcbiAgcHJpdmF0ZSBfd2hpdGVzcGFjZUNlbGw6IElDZWxsRGF0YSA9IENlbGxEYXRhLmZyb21DaGFyRGF0YShbMCwgV0hJVEVTUEFDRV9DRUxMX0NIQVIsIFdISVRFU1BBQ0VfQ0VMTF9XSURUSCwgV0hJVEVTUEFDRV9DRUxMX0NPREVdKTtcbiAgcHJpdmF0ZSBfY29sczogbnVtYmVyO1xuICBwcml2YXRlIF9yb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgX2lzQ2xlYXJpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9oYXNTY3JvbGxiYWNrOiBib29sZWFuLFxuICAgIHByaXZhdGUgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5fY29scyA9IHRoaXMuX2J1ZmZlclNlcnZpY2UuY29scztcbiAgICB0aGlzLl9yb3dzID0gdGhpcy5fYnVmZmVyU2VydmljZS5yb3dzO1xuICAgIHRoaXMubGluZXMgPSBuZXcgQ2lyY3VsYXJMaXN0PElCdWZmZXJMaW5lPih0aGlzLl9nZXRDb3JyZWN0QnVmZmVyTGVuZ3RoKHRoaXMuX3Jvd3MpKTtcbiAgICB0aGlzLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSB0aGlzLl9yb3dzIC0gMTtcbiAgICB0aGlzLnNldHVwVGFiU3RvcHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdWxsQ2VsbChhdHRyPzogSUF0dHJpYnV0ZURhdGEpOiBJQ2VsbERhdGEge1xuICAgIGlmIChhdHRyKSB7XG4gICAgICB0aGlzLl9udWxsQ2VsbC5mZyA9IGF0dHIuZmc7XG4gICAgICB0aGlzLl9udWxsQ2VsbC5iZyA9IGF0dHIuYmc7XG4gICAgICB0aGlzLl9udWxsQ2VsbC5leHRlbmRlZCA9IGF0dHIuZXh0ZW5kZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX251bGxDZWxsLmZnID0gMDtcbiAgICAgIHRoaXMuX251bGxDZWxsLmJnID0gMDtcbiAgICAgIHRoaXMuX251bGxDZWxsLmV4dGVuZGVkID0gbmV3IEV4dGVuZGVkQXR0cnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX251bGxDZWxsO1xuICB9XG5cbiAgcHVibGljIGdldFdoaXRlc3BhY2VDZWxsKGF0dHI/OiBJQXR0cmlidXRlRGF0YSk6IElDZWxsRGF0YSB7XG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIHRoaXMuX3doaXRlc3BhY2VDZWxsLmZnID0gYXR0ci5mZztcbiAgICAgIHRoaXMuX3doaXRlc3BhY2VDZWxsLmJnID0gYXR0ci5iZztcbiAgICAgIHRoaXMuX3doaXRlc3BhY2VDZWxsLmV4dGVuZGVkID0gYXR0ci5leHRlbmRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fd2hpdGVzcGFjZUNlbGwuZmcgPSAwO1xuICAgICAgdGhpcy5fd2hpdGVzcGFjZUNlbGwuYmcgPSAwO1xuICAgICAgdGhpcy5fd2hpdGVzcGFjZUNlbGwuZXh0ZW5kZWQgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fd2hpdGVzcGFjZUNlbGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmxhbmtMaW5lKGF0dHI6IElBdHRyaWJ1dGVEYXRhLCBpc1dyYXBwZWQ/OiBib29sZWFuKTogSUJ1ZmZlckxpbmUge1xuICAgIHJldHVybiBuZXcgQnVmZmVyTGluZSh0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHMsIHRoaXMuZ2V0TnVsbENlbGwoYXR0ciksIGlzV3JhcHBlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc1Njcm9sbGJhY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc1Njcm9sbGJhY2sgJiYgdGhpcy5saW5lcy5tYXhMZW5ndGggPiB0aGlzLl9yb3dzO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0N1cnNvckluVmlld3BvcnQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWJzb2x1dGVZID0gdGhpcy55YmFzZSArIHRoaXMueTtcbiAgICBjb25zdCByZWxhdGl2ZVkgPSBhYnNvbHV0ZVkgLSB0aGlzLnlkaXNwO1xuICAgIHJldHVybiAocmVsYXRpdmVZID49IDAgJiYgcmVsYXRpdmVZIDwgdGhpcy5fcm93cyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY29ycmVjdCBidWZmZXIgbGVuZ3RoIGJhc2VkIG9uIHRoZSByb3dzIHByb3ZpZGVkLCB0aGUgdGVybWluYWwnc1xuICAgKiBzY3JvbGxiYWNrIGFuZCB3aGV0aGVyIHRoaXMgYnVmZmVyIGlzIGZsYWdnZWQgdG8gaGF2ZSBzY3JvbGxiYWNrIG9yIG5vdC5cbiAgICogQHBhcmFtIHJvd3MgVGhlIHRlcm1pbmFsIHJvd3MgdG8gdXNlIGluIHRoZSBjYWxjdWxhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgX2dldENvcnJlY3RCdWZmZXJMZW5ndGgocm93czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuX2hhc1Njcm9sbGJhY2spIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cblxuICAgIGNvbnN0IGNvcnJlY3RCdWZmZXJMZW5ndGggPSByb3dzICsgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5zY3JvbGxiYWNrO1xuXG4gICAgcmV0dXJuIGNvcnJlY3RCdWZmZXJMZW5ndGggPiBNQVhfQlVGRkVSX1NJWkUgPyBNQVhfQlVGRkVSX1NJWkUgOiBjb3JyZWN0QnVmZmVyTGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIHRoZSBidWZmZXIncyB2aWV3cG9ydCB3aXRoIGJsYW5rIGxpbmVzLlxuICAgKi9cbiAgcHVibGljIGZpbGxWaWV3cG9ydFJvd3MoZmlsbEF0dHI/OiBJQXR0cmlidXRlRGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGZpbGxBdHRyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZmlsbEF0dHIgPSBERUZBVUxUX0FUVFJfREFUQTtcbiAgICAgIH1cbiAgICAgIGxldCBpID0gdGhpcy5fcm93cztcbiAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdGhpcy5saW5lcy5wdXNoKHRoaXMuZ2V0QmxhbmtMaW5lKGZpbGxBdHRyKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgYnVmZmVyIHRvIGl0J3MgaW5pdGlhbCBzdGF0ZSwgZGlzY2FyZGluZyBhbGwgcHJldmlvdXMgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnlkaXNwID0gMDtcbiAgICB0aGlzLnliYXNlID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy5saW5lcyA9IG5ldyBDaXJjdWxhckxpc3Q8SUJ1ZmZlckxpbmU+KHRoaXMuX2dldENvcnJlY3RCdWZmZXJMZW5ndGgodGhpcy5fcm93cykpO1xuICAgIHRoaXMuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLnNjcm9sbEJvdHRvbSA9IHRoaXMuX3Jvd3MgLSAxO1xuICAgIHRoaXMuc2V0dXBUYWJTdG9wcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2l6ZXMgdGhlIGJ1ZmZlciwgYWRqdXN0aW5nIGl0cyBkYXRhIGFjY29yZGluZ2x5LlxuICAgKiBAcGFyYW0gbmV3Q29scyBUaGUgbmV3IG51bWJlciBvZiBjb2x1bW5zLlxuICAgKiBAcGFyYW0gbmV3Um93cyBUaGUgbmV3IG51bWJlciBvZiByb3dzLlxuICAgKi9cbiAgcHVibGljIHJlc2l6ZShuZXdDb2xzOiBudW1iZXIsIG5ld1Jvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIHN0b3JlIHJlZmVyZW5jZSB0byBudWxsIGNlbGwgd2l0aCBkZWZhdWx0IGF0dHJzXG4gICAgY29uc3QgbnVsbENlbGwgPSB0aGlzLmdldE51bGxDZWxsKERFRkFVTFRfQVRUUl9EQVRBKTtcblxuICAgIC8vIGNvdW50IGJ1ZmZlcmxpbmVzIHdpdGggb3Zlcmx5IGJpZyBtZW1vcnkgdG8gYmUgY2xlYW5lZCBhZnRlcndhcmRzXG4gICAgbGV0IGRpcnR5TWVtb3J5TGluZXMgPSAwO1xuXG4gICAgLy8gSW5jcmVhc2UgbWF4IGxlbmd0aCBpZiBuZWVkZWQgYmVmb3JlIGFkanVzdG1lbnRzIHRvIGFsbG93IHNwYWNlIHRvIGZpbGxcbiAgICAvLyBhcyByZXF1aXJlZC5cbiAgICBjb25zdCBuZXdNYXhMZW5ndGggPSB0aGlzLl9nZXRDb3JyZWN0QnVmZmVyTGVuZ3RoKG5ld1Jvd3MpO1xuICAgIGlmIChuZXdNYXhMZW5ndGggPiB0aGlzLmxpbmVzLm1heExlbmd0aCkge1xuICAgICAgdGhpcy5saW5lcy5tYXhMZW5ndGggPSBuZXdNYXhMZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBhZGp1c3RtZW50cyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIGJ1ZmZlciBoYXMgYmVlblxuICAgIC8vIGluaXRpYWxpemVkL2ZpbGxlZC5cbiAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBEZWFsIHdpdGggY29sdW1ucyBpbmNyZWFzaW5nIChyZWR1Y2luZyBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgcmVmbG93KVxuICAgICAgaWYgKHRoaXMuX2NvbHMgPCBuZXdDb2xzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vICtib29sZWFuIGZvciBmYXN0IDAgb3IgMSBjb252ZXJzaW9uXG4gICAgICAgICAgZGlydHlNZW1vcnlMaW5lcyArPSArdGhpcy5saW5lcy5nZXQoaSkhLnJlc2l6ZShuZXdDb2xzLCBudWxsQ2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVzaXplIHJvd3MgaW4gYm90aCBkaXJlY3Rpb25zIGFzIG5lZWRlZFxuICAgICAgbGV0IGFkZFRvWSA9IDA7XG4gICAgICBpZiAodGhpcy5fcm93cyA8IG5ld1Jvd3MpIHtcbiAgICAgICAgZm9yIChsZXQgeSA9IHRoaXMuX3Jvd3M7IHkgPCBuZXdSb3dzOyB5KyspIHtcbiAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCBuZXdSb3dzICsgdGhpcy55YmFzZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c01vZGUgfHwgdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzUHR5LmJhY2tlbmQgIT09IHVuZGVmaW5lZCB8fCB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLndpbmRvd3NQdHkuYnVpbGROdW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBKdXN0IGFkZCB0aGUgbmV3IG1pc3Npbmcgcm93cyBvbiBXaW5kb3dzIGFzIGNvbnB0eSByZXByaW50cyB0aGUgc2NyZWVuIHdpdGggaXQnc1xuICAgICAgICAgICAgICAvLyB2aWV3IG9mIHRoZSB3b3JsZC4gT25jZSBhIGxpbmUgZW50ZXJzIHNjcm9sbGJhY2sgZm9yIGNvbnB0eSBpdCByZW1haW5zIHRoZXJlXG4gICAgICAgICAgICAgIHRoaXMubGluZXMucHVzaChuZXcgQnVmZmVyTGluZShuZXdDb2xzLCBudWxsQ2VsbCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMueWJhc2UgPiAwICYmIHRoaXMubGluZXMubGVuZ3RoIDw9IHRoaXMueWJhc2UgKyB0aGlzLnkgKyBhZGRUb1kgKyAxKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgcm9vbSBhYm92ZSB0aGUgYnVmZmVyIGFuZCB0aGVyZSBhcmUgbm8gZW1wdHkgZWxlbWVudHMgYmVsb3cgdGhlIGxpbmUsXG4gICAgICAgICAgICAgICAgLy8gc2Nyb2xsIHVwXG4gICAgICAgICAgICAgICAgdGhpcy55YmFzZS0tO1xuICAgICAgICAgICAgICAgIGFkZFRvWSsrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnlkaXNwID4gMCkge1xuICAgICAgICAgICAgICAgICAgLy8gVmlld3BvcnQgaXMgYXQgdGhlIHRvcCBvZiB0aGUgYnVmZmVyLCBtdXN0IGluY3JlYXNlIGRvd253YXJkc1xuICAgICAgICAgICAgICAgICAgdGhpcy55ZGlzcC0tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgYSBibGFuayBsaW5lIGlmIHRoZXJlIGlzIG5vIGJ1ZmZlciBsZWZ0IGF0IHRoZSB0b3AgdG8gc2Nyb2xsIHRvLCBvciBpZiB0aGVyZVxuICAgICAgICAgICAgICAgIC8vIGFyZSBibGFuayBsaW5lcyBhZnRlciB0aGUgY3Vyc29yXG4gICAgICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKG5ldyBCdWZmZXJMaW5lKG5ld0NvbHMsIG51bGxDZWxsKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7IC8vICh0aGlzLl9yb3dzID49IG5ld1Jvd3MpXG4gICAgICAgIGZvciAobGV0IHkgPSB0aGlzLl9yb3dzOyB5ID4gbmV3Um93czsgeS0tKSB7XG4gICAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoID4gbmV3Um93cyArIHRoaXMueWJhc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA+IHRoaXMueWJhc2UgKyB0aGlzLnkgKyAxKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGlzIGEgYmxhbmsgbGluZSBiZWxvdyB0aGUgY3Vyc29yLCByZW1vdmUgaXRcbiAgICAgICAgICAgICAgdGhpcy5saW5lcy5wb3AoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBsaW5lIGlzIHRoZSBjdXJzb3IsIHNjcm9sbCBkb3duXG4gICAgICAgICAgICAgIHRoaXMueWJhc2UrKztcbiAgICAgICAgICAgICAgdGhpcy55ZGlzcCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZWR1Y2UgbWF4IGxlbmd0aCBpZiBuZWVkZWQgYWZ0ZXIgYWRqdXN0bWVudHMsIHRoaXMgaXMgZG9uZSBhZnRlciBhcyBpdFxuICAgICAgLy8gd291bGQgb3RoZXJ3aXNlIGN1dCBkYXRhIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgYnVmZmVyLlxuICAgICAgaWYgKG5ld01heExlbmd0aCA8IHRoaXMubGluZXMubWF4TGVuZ3RoKSB7XG4gICAgICAgIC8vIFRyaW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBidWZmZXIgYW5kIGFkanVzdCB5YmFzZSBhbmQgeWRpc3AuXG4gICAgICAgIGNvbnN0IGFtb3VudFRvVHJpbSA9IHRoaXMubGluZXMubGVuZ3RoIC0gbmV3TWF4TGVuZ3RoO1xuICAgICAgICBpZiAoYW1vdW50VG9UcmltID4gMCkge1xuICAgICAgICAgIHRoaXMubGluZXMudHJpbVN0YXJ0KGFtb3VudFRvVHJpbSk7XG4gICAgICAgICAgdGhpcy55YmFzZSA9IE1hdGgubWF4KHRoaXMueWJhc2UgLSBhbW91bnRUb1RyaW0sIDApO1xuICAgICAgICAgIHRoaXMueWRpc3AgPSBNYXRoLm1heCh0aGlzLnlkaXNwIC0gYW1vdW50VG9UcmltLCAwKTtcbiAgICAgICAgICB0aGlzLnNhdmVkWSA9IE1hdGgubWF4KHRoaXMuc2F2ZWRZIC0gYW1vdW50VG9UcmltLCAwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpbmVzLm1heExlbmd0aCA9IG5ld01heExlbmd0aDtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGN1cnNvciBzdGF5cyBvbiBzY3JlZW5cbiAgICAgIHRoaXMueCA9IE1hdGgubWluKHRoaXMueCwgbmV3Q29scyAtIDEpO1xuICAgICAgdGhpcy55ID0gTWF0aC5taW4odGhpcy55LCBuZXdSb3dzIC0gMSk7XG4gICAgICBpZiAoYWRkVG9ZKSB7XG4gICAgICAgIHRoaXMueSArPSBhZGRUb1k7XG4gICAgICB9XG4gICAgICB0aGlzLnNhdmVkWCA9IE1hdGgubWluKHRoaXMuc2F2ZWRYLCBuZXdDb2xzIC0gMSk7XG5cbiAgICAgIHRoaXMuc2Nyb2xsVG9wID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLnNjcm9sbEJvdHRvbSA9IG5ld1Jvd3MgLSAxO1xuXG4gICAgaWYgKHRoaXMuX2lzUmVmbG93RW5hYmxlZCkge1xuICAgICAgdGhpcy5fcmVmbG93KG5ld0NvbHMsIG5ld1Jvd3MpO1xuXG4gICAgICAvLyBUcmltIHRoZSBlbmQgb2YgdGhlIGxpbmUgb2ZmIGlmIGNvbHMgc2hydW5rXG4gICAgICBpZiAodGhpcy5fY29scyA+IG5ld0NvbHMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgLy8gK2Jvb2xlYW4gZm9yIGZhc3QgMCBvciAxIGNvbnZlcnNpb25cbiAgICAgICAgICBkaXJ0eU1lbW9yeUxpbmVzICs9ICt0aGlzLmxpbmVzLmdldChpKSEucmVzaXplKG5ld0NvbHMsIG51bGxDZWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NvbHMgPSBuZXdDb2xzO1xuICAgIHRoaXMuX3Jvd3MgPSBuZXdSb3dzO1xuXG4gICAgdGhpcy5fbWVtb3J5Q2xlYW51cFF1ZXVlLmNsZWFyKCk7XG4gICAgLy8gc2NoZWR1bGUgbWVtb3J5IGNsZWFudXAgb25seSwgaWYgbW9yZSB0aGFuIDEwJSBvZiB0aGUgbGluZXMgYXJlIGFmZmVjdGVkXG4gICAgaWYgKGRpcnR5TWVtb3J5TGluZXMgPiAwLjEgKiB0aGlzLmxpbmVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5fbWVtb3J5Q2xlYW51cFBvc2l0aW9uID0gMDtcbiAgICAgIHRoaXMuX21lbW9yeUNsZWFudXBRdWV1ZS5lbnF1ZXVlKCgpID0+IHRoaXMuX2JhdGNoZWRNZW1vcnlDbGVhbnVwKCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX21lbW9yeUNsZWFudXBRdWV1ZSA9IG5ldyBJZGxlVGFza1F1ZXVlKCk7XG4gIHByaXZhdGUgX21lbW9yeUNsZWFudXBQb3NpdGlvbiA9IDA7XG5cbiAgcHJpdmF0ZSBfYmF0Y2hlZE1lbW9yeUNsZWFudXAoKTogYm9vbGVhbiB7XG4gICAgbGV0IG5vcm1hbFJ1biA9IHRydWU7XG4gICAgaWYgKHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbiA+PSB0aGlzLmxpbmVzLmxlbmd0aCkge1xuICAgICAgLy8gY2xlYW51cCBtYWRlIGl0IG9uY2UgdGhyb3VnaCBhbGwgbGluZXMsIHRodXMgcmVzY2FuIGluIGxvb3AgYmVsb3cgdG8gYWxzbyBjYXRjaCBzaGlmdGVkXG4gICAgICAvLyBsaW5lcywgd2hpY2ggc2hvdWxkIGZpbmlzaCByYXRoZXIgcXVpY2sgaWYgdGhlcmUgYXJlIG5vIG1vcmUgY2xlYW51cHMgcGVuZGluZ1xuICAgICAgdGhpcy5fbWVtb3J5Q2xlYW51cFBvc2l0aW9uID0gMDtcbiAgICAgIG5vcm1hbFJ1biA9IGZhbHNlO1xuICAgIH1cbiAgICBsZXQgY291bnRlZCA9IDA7XG4gICAgd2hpbGUgKHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbiA8IHRoaXMubGluZXMubGVuZ3RoKSB7XG4gICAgICBjb3VudGVkICs9IHRoaXMubGluZXMuZ2V0KHRoaXMuX21lbW9yeUNsZWFudXBQb3NpdGlvbisrKSEuY2xlYW51cE1lbW9yeSgpO1xuICAgICAgLy8gY2xlYW51cCBtYXggMTAwIGxpbmVzIHBlciBiYXRjaFxuICAgICAgaWYgKGNvdW50ZWQgPiAxMDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vcm1hbCBydW5zIGFsd2F5cyBuZWVkIGFub3RoZXIgcmVzY2FuIGFmdGVyd2FyZHNcbiAgICAvLyBpZiB3ZSBtYWRlIGl0IGhlcmUgd2l0aCBub3JtYWxSdW49ZmFsc2UsIHdlIGFyZSBpbiBhIGZpbmFsIHJ1blxuICAgIC8vIGFuZCBjYW4gZW5kIHRoZSBjbGVhbnVwIHRhc2sgZm9yIHN1cmVcbiAgICByZXR1cm4gbm9ybWFsUnVuO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2lzUmVmbG93RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB3aW5kb3dzUHR5ID0gdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy53aW5kb3dzUHR5O1xuICAgIGlmICh3aW5kb3dzUHR5ICYmIHdpbmRvd3NQdHkuYnVpbGROdW1iZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYXNTY3JvbGxiYWNrICYmIHdpbmRvd3NQdHkuYmFja2VuZCA9PT0gJ2NvbnB0eScgJiYgd2luZG93c1B0eS5idWlsZE51bWJlciA+PSAyMTM3NjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2hhc1Njcm9sbGJhY2sgJiYgIXRoaXMuX29wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMud2luZG93c01vZGU7XG4gIH1cblxuICBwcml2YXRlIF9yZWZsb3cobmV3Q29sczogbnVtYmVyLCBuZXdSb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29scyA9PT0gbmV3Q29scykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCByb3dzLCBpZ25vcmUgdGhlIGxhc3Qgb25lIGFzIGl0IGNhbm5vdCBiZSB3cmFwcGVkXG4gICAgaWYgKG5ld0NvbHMgPiB0aGlzLl9jb2xzKSB7XG4gICAgICB0aGlzLl9yZWZsb3dMYXJnZXIobmV3Q29scywgbmV3Um93cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlZmxvd1NtYWxsZXIobmV3Q29scywgbmV3Um93cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVmbG93TGFyZ2VyKG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG9SZW1vdmU6IG51bWJlcltdID0gcmVmbG93TGFyZ2VyR2V0TGluZXNUb1JlbW92ZSh0aGlzLmxpbmVzLCB0aGlzLl9jb2xzLCBuZXdDb2xzLCB0aGlzLnliYXNlICsgdGhpcy55LCB0aGlzLmdldE51bGxDZWxsKERFRkFVTFRfQVRUUl9EQVRBKSk7XG4gICAgaWYgKHRvUmVtb3ZlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5ld0xheW91dFJlc3VsdCA9IHJlZmxvd0xhcmdlckNyZWF0ZU5ld0xheW91dCh0aGlzLmxpbmVzLCB0b1JlbW92ZSk7XG4gICAgICByZWZsb3dMYXJnZXJBcHBseU5ld0xheW91dCh0aGlzLmxpbmVzLCBuZXdMYXlvdXRSZXN1bHQubGF5b3V0KTtcbiAgICAgIHRoaXMuX3JlZmxvd0xhcmdlckFkanVzdFZpZXdwb3J0KG5ld0NvbHMsIG5ld1Jvd3MsIG5ld0xheW91dFJlc3VsdC5jb3VudFJlbW92ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZmxvd0xhcmdlckFkanVzdFZpZXdwb3J0KG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyLCBjb3VudFJlbW92ZWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG51bGxDZWxsID0gdGhpcy5nZXROdWxsQ2VsbChERUZBVUxUX0FUVFJfREFUQSk7XG4gICAgLy8gQWRqdXN0IHZpZXdwb3J0IGJhc2VkIG9uIG51bWJlciBvZiBpdGVtcyByZW1vdmVkXG4gICAgbGV0IHZpZXdwb3J0QWRqdXN0bWVudHMgPSBjb3VudFJlbW92ZWQ7XG4gICAgd2hpbGUgKHZpZXdwb3J0QWRqdXN0bWVudHMtLSA+IDApIHtcbiAgICAgIGlmICh0aGlzLnliYXNlID09PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnkgPiAwKSB7XG4gICAgICAgICAgdGhpcy55LS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoIDwgbmV3Um93cykge1xuICAgICAgICAgIC8vIEFkZCBhbiBleHRyYSByb3cgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdmlld3BvcnRcbiAgICAgICAgICB0aGlzLmxpbmVzLnB1c2gobmV3IEJ1ZmZlckxpbmUobmV3Q29scywgbnVsbENlbGwpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMueWRpc3AgPT09IHRoaXMueWJhc2UpIHtcbiAgICAgICAgICB0aGlzLnlkaXNwLS07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy55YmFzZS0tO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNhdmVkWSA9IE1hdGgubWF4KHRoaXMuc2F2ZWRZIC0gY291bnRSZW1vdmVkLCAwKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZmxvd1NtYWxsZXIobmV3Q29sczogbnVtYmVyLCBuZXdSb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBudWxsQ2VsbCA9IHRoaXMuZ2V0TnVsbENlbGwoREVGQVVMVF9BVFRSX0RBVEEpO1xuICAgIC8vIEdhdGhlciBhbGwgQnVmZmVyTGluZXMgdGhhdCBuZWVkIHRvIGJlIGluc2VydGVkIGludG8gdGhlIEJ1ZmZlciBoZXJlIHNvIHRoYXQgdGhleSBjYW4gYmVcbiAgICAvLyBiYXRjaGVkIHVwIGFuZCBvbmx5IGNvbW1pdHRlZCBvbmNlXG4gICAgY29uc3QgdG9JbnNlcnQgPSBbXTtcbiAgICBsZXQgY291bnRUb0luc2VydCA9IDA7XG4gICAgLy8gR28gYmFja3dhcmRzIGFzIG1hbnkgbGluZXMgbWF5IGJlIHRyaW1tZWQgYW5kIHRoaXMgd2lsbCBhdm9pZCBjb25zaWRlcmluZyB0aGVtXG4gICAgZm9yIChsZXQgeSA9IHRoaXMubGluZXMubGVuZ3RoIC0gMTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBsaW5lIGlzIGEgcHJvYmxlbVxuICAgICAgbGV0IG5leHRMaW5lID0gdGhpcy5saW5lcy5nZXQoeSkgYXMgQnVmZmVyTGluZTtcbiAgICAgIGlmICghbmV4dExpbmUgfHwgIW5leHRMaW5lLmlzV3JhcHBlZCAmJiBuZXh0TGluZS5nZXRUcmltbWVkTGVuZ3RoKCkgPD0gbmV3Q29scykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gR2F0aGVyIHdyYXBwZWQgbGluZXMgYW5kIGFkanVzdCB5IHRvIGJlIHRoZSBzdGFydGluZyBsaW5lXG4gICAgICBjb25zdCB3cmFwcGVkTGluZXM6IEJ1ZmZlckxpbmVbXSA9IFtuZXh0TGluZV07XG4gICAgICB3aGlsZSAobmV4dExpbmUuaXNXcmFwcGVkICYmIHkgPiAwKSB7XG4gICAgICAgIG5leHRMaW5lID0gdGhpcy5saW5lcy5nZXQoLS15KSBhcyBCdWZmZXJMaW5lO1xuICAgICAgICB3cmFwcGVkTGluZXMudW5zaGlmdChuZXh0TGluZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZXNlIGxpbmVzIGNvbnRhaW4gdGhlIGN1cnNvciBkb24ndCB0b3VjaCB0aGVtLCB0aGUgcHJvZ3JhbSB3aWxsIGhhbmRsZSBmaXhpbmcgdXBcbiAgICAgIC8vIHdyYXBwZWQgbGluZXMgd2l0aCB0aGUgY3Vyc29yXG4gICAgICBjb25zdCBhYnNvbHV0ZVkgPSB0aGlzLnliYXNlICsgdGhpcy55O1xuICAgICAgaWYgKGFic29sdXRlWSA+PSB5ICYmIGFic29sdXRlWSA8IHkgKyB3cmFwcGVkTGluZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYXN0TGluZUxlbmd0aCA9IHdyYXBwZWRMaW5lc1t3cmFwcGVkTGluZXMubGVuZ3RoIC0gMV0uZ2V0VHJpbW1lZExlbmd0aCgpO1xuICAgICAgY29uc3QgZGVzdExpbmVMZW5ndGhzID0gcmVmbG93U21hbGxlckdldE5ld0xpbmVMZW5ndGhzKHdyYXBwZWRMaW5lcywgdGhpcy5fY29scywgbmV3Q29scyk7XG4gICAgICBjb25zdCBsaW5lc1RvQWRkID0gZGVzdExpbmVMZW5ndGhzLmxlbmd0aCAtIHdyYXBwZWRMaW5lcy5sZW5ndGg7XG4gICAgICBsZXQgdHJpbW1lZExpbmVzOiBudW1iZXI7XG4gICAgICBpZiAodGhpcy55YmFzZSA9PT0gMCAmJiB0aGlzLnkgIT09IHRoaXMubGluZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAvLyBJZiB0aGUgdG9wIHNlY3Rpb24gb2YgdGhlIGJ1ZmZlciBpcyBub3QgeWV0IGZpbGxlZFxuICAgICAgICB0cmltbWVkTGluZXMgPSBNYXRoLm1heCgwLCB0aGlzLnkgLSB0aGlzLmxpbmVzLm1heExlbmd0aCArIGxpbmVzVG9BZGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpbW1lZExpbmVzID0gTWF0aC5tYXgoMCwgdGhpcy5saW5lcy5sZW5ndGggLSB0aGlzLmxpbmVzLm1heExlbmd0aCArIGxpbmVzVG9BZGQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgdGhlIG5ldyBsaW5lc1xuICAgICAgY29uc3QgbmV3TGluZXM6IEJ1ZmZlckxpbmVbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lc1RvQWRkOyBpKyspIHtcbiAgICAgICAgY29uc3QgbmV3TGluZSA9IHRoaXMuZ2V0QmxhbmtMaW5lKERFRkFVTFRfQVRUUl9EQVRBLCB0cnVlKSBhcyBCdWZmZXJMaW5lO1xuICAgICAgICBuZXdMaW5lcy5wdXNoKG5ld0xpbmUpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld0xpbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9JbnNlcnQucHVzaCh7XG4gICAgICAgICAgLy8gY291bnRUb0luc2VydCBoZXJlIGdldHMgdGhlIGFjdHVhbCBpbmRleCwgdGFraW5nIGludG8gYWNjb3VudCBvdGhlciBpbnNlcnRlZCBpdGVtcy5cbiAgICAgICAgICAvLyB1c2luZyB0aGlzIHdlIGNhbiBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3QgZm9yd2FyZHNcbiAgICAgICAgICBzdGFydDogeSArIHdyYXBwZWRMaW5lcy5sZW5ndGggKyBjb3VudFRvSW5zZXJ0LFxuICAgICAgICAgIG5ld0xpbmVzXG4gICAgICAgIH0pO1xuICAgICAgICBjb3VudFRvSW5zZXJ0ICs9IG5ld0xpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKC4uLm5ld0xpbmVzKTtcblxuICAgICAgLy8gQ29weSBidWZmZXIgZGF0YSB0byBuZXcgbG9jYXRpb25zLCB0aGlzIG5lZWRzIHRvIGhhcHBlbiBiYWNrd2FyZHMgdG8gZG8gaW4tcGxhY2VcbiAgICAgIGxldCBkZXN0TGluZUluZGV4ID0gZGVzdExpbmVMZW5ndGhzLmxlbmd0aCAtIDE7IC8vIE1hdGguZmxvb3IoY2VsbHNOZWVkZWQgLyBuZXdDb2xzKTtcbiAgICAgIGxldCBkZXN0Q29sID0gZGVzdExpbmVMZW5ndGhzW2Rlc3RMaW5lSW5kZXhdOyAvLyBjZWxsc05lZWRlZCAlIG5ld0NvbHM7XG4gICAgICBpZiAoZGVzdENvbCA9PT0gMCkge1xuICAgICAgICBkZXN0TGluZUluZGV4LS07XG4gICAgICAgIGRlc3RDb2wgPSBkZXN0TGluZUxlbmd0aHNbZGVzdExpbmVJbmRleF07XG4gICAgICB9XG4gICAgICBsZXQgc3JjTGluZUluZGV4ID0gd3JhcHBlZExpbmVzLmxlbmd0aCAtIGxpbmVzVG9BZGQgLSAxO1xuICAgICAgbGV0IHNyY0NvbCA9IGxhc3RMaW5lTGVuZ3RoO1xuICAgICAgd2hpbGUgKHNyY0xpbmVJbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IGNlbGxzVG9Db3B5ID0gTWF0aC5taW4oc3JjQ29sLCBkZXN0Q29sKTtcbiAgICAgICAgaWYgKHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHRoYXQgdGhlIGxpbmUgZXhpc3RzLCB0aGlzIGhhcyBiZWVuIGtub3duIHRvIGZhaWwgZm9yIGFuIHVua25vd24gcmVhc29uXG4gICAgICAgICAgLy8gd2hpY2ggd291bGQgc3RvcCB0aGUgcmVmbG93IGZyb20gaGFwcGVuaW5nIGlmIGFuIGV4Y2VwdGlvbiB3b3VsZCB0aHJvdy5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleF0uY29weUNlbGxzRnJvbSh3cmFwcGVkTGluZXNbc3JjTGluZUluZGV4XSwgc3JjQ29sIC0gY2VsbHNUb0NvcHksIGRlc3RDb2wgLSBjZWxsc1RvQ29weSwgY2VsbHNUb0NvcHksIHRydWUpO1xuICAgICAgICBkZXN0Q29sIC09IGNlbGxzVG9Db3B5O1xuICAgICAgICBpZiAoZGVzdENvbCA9PT0gMCkge1xuICAgICAgICAgIGRlc3RMaW5lSW5kZXgtLTtcbiAgICAgICAgICBkZXN0Q29sID0gZGVzdExpbmVMZW5ndGhzW2Rlc3RMaW5lSW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHNyY0NvbCAtPSBjZWxsc1RvQ29weTtcbiAgICAgICAgaWYgKHNyY0NvbCA9PT0gMCkge1xuICAgICAgICAgIHNyY0xpbmVJbmRleC0tO1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRMaW5lc0luZGV4ID0gTWF0aC5tYXgoc3JjTGluZUluZGV4LCAwKTtcbiAgICAgICAgICBzcmNDb2wgPSBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgod3JhcHBlZExpbmVzLCB3cmFwcGVkTGluZXNJbmRleCwgdGhpcy5fY29scyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTnVsbCBvdXQgdGhlIGVuZCBvZiB0aGUgbGluZSBlbmRzIGlmIGEgd2lkZSBjaGFyYWN0ZXIgd3JhcHBlZCB0byB0aGUgZm9sbG93aW5nIGxpbmVcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcHBlZExpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkZXN0TGluZUxlbmd0aHNbaV0gPCBuZXdDb2xzKSB7XG4gICAgICAgICAgd3JhcHBlZExpbmVzW2ldLnNldENlbGwoZGVzdExpbmVMZW5ndGhzW2ldLCBudWxsQ2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHZpZXdwb3J0IGFzIG5lZWRlZFxuICAgICAgbGV0IHZpZXdwb3J0QWRqdXN0bWVudHMgPSBsaW5lc1RvQWRkIC0gdHJpbW1lZExpbmVzO1xuICAgICAgd2hpbGUgKHZpZXdwb3J0QWRqdXN0bWVudHMtLSA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMueWJhc2UgPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy55IDwgbmV3Um93cyAtIDEpIHtcbiAgICAgICAgICAgIHRoaXMueSsrO1xuICAgICAgICAgICAgdGhpcy5saW5lcy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy55YmFzZSsrO1xuICAgICAgICAgICAgdGhpcy55ZGlzcCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBFbnN1cmUgeWJhc2UgZG9lcyBub3QgZXhjZWVkIGl0cyBtYXhpbXVtIHZhbHVlXG4gICAgICAgICAgaWYgKHRoaXMueWJhc2UgPCBNYXRoLm1pbih0aGlzLmxpbmVzLm1heExlbmd0aCwgdGhpcy5saW5lcy5sZW5ndGggKyBjb3VudFRvSW5zZXJ0KSAtIG5ld1Jvd3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnliYXNlID09PSB0aGlzLnlkaXNwKSB7XG4gICAgICAgICAgICAgIHRoaXMueWRpc3ArKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMueWJhc2UrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2F2ZWRZID0gTWF0aC5taW4odGhpcy5zYXZlZFkgKyBsaW5lc1RvQWRkLCB0aGlzLnliYXNlICsgbmV3Um93cyAtIDEpO1xuICAgIH1cblxuICAgIC8vIFJlYXJyYW5nZSBsaW5lcyBpbiB0aGUgYnVmZmVyIGlmIHRoZXJlIGFyZSBhbnkgaW5zZXJ0aW9ucywgdGhpcyBpcyBkb25lIGF0IHRoZSBlbmQgcmF0aGVyXG4gICAgLy8gdGhhbiBlYXJsaWVyIHNvIHRoYXQgaXQncyBhIHNpbmdsZSBPKG4pIHBhc3MgdGhyb3VnaCB0aGUgYnVmZmVyLCBpbnN0ZWFkIG9mIE8obl4yKSBmcm9tIG1hbnlcbiAgICAvLyBjb3N0bHkgY2FsbHMgdG8gQ2lyY3VsYXJMaXN0LnNwbGljZS5cbiAgICBpZiAodG9JbnNlcnQubGVuZ3RoID4gMCkge1xuICAgICAgLy8gUmVjb3JkIGJ1ZmZlciBpbnNlcnQgZXZlbnRzIGFuZCB0aGVuIHBsYXkgdGhlbSBiYWNrIGJhY2t3YXJkcyBzbyB0aGF0IHRoZSBpbmRleGVzIGFyZVxuICAgICAgLy8gY29ycmVjdFxuICAgICAgY29uc3QgaW5zZXJ0RXZlbnRzOiBJSW5zZXJ0RXZlbnRbXSA9IFtdO1xuXG4gICAgICAvLyBSZWNvcmQgb3JpZ2luYWwgbGluZXMgc28gdGhleSBkb24ndCBnZXQgb3ZlcnJpZGRlbiB3aGVuIHdlIHJlYXJyYW5nZSB0aGUgbGlzdFxuICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lczogQnVmZmVyTGluZVtdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3JpZ2luYWxMaW5lcy5wdXNoKHRoaXMubGluZXMuZ2V0KGkpIGFzIEJ1ZmZlckxpbmUpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lc0xlbmd0aCA9IHRoaXMubGluZXMubGVuZ3RoO1xuXG4gICAgICBsZXQgb3JpZ2luYWxMaW5lSW5kZXggPSBvcmlnaW5hbExpbmVzTGVuZ3RoIC0gMTtcbiAgICAgIGxldCBuZXh0VG9JbnNlcnRJbmRleCA9IDA7XG4gICAgICBsZXQgbmV4dFRvSW5zZXJ0ID0gdG9JbnNlcnRbbmV4dFRvSW5zZXJ0SW5kZXhdO1xuICAgICAgdGhpcy5saW5lcy5sZW5ndGggPSBNYXRoLm1pbih0aGlzLmxpbmVzLm1heExlbmd0aCwgdGhpcy5saW5lcy5sZW5ndGggKyBjb3VudFRvSW5zZXJ0KTtcbiAgICAgIGxldCBjb3VudEluc2VydGVkU29GYXIgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKHRoaXMubGluZXMubWF4TGVuZ3RoIC0gMSwgb3JpZ2luYWxMaW5lc0xlbmd0aCArIGNvdW50VG9JbnNlcnQgLSAxKTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKG5leHRUb0luc2VydCAmJiBuZXh0VG9JbnNlcnQuc3RhcnQgPiBvcmlnaW5hbExpbmVJbmRleCArIGNvdW50SW5zZXJ0ZWRTb0Zhcikge1xuICAgICAgICAgIC8vIEluc2VydCBleHRyYSBsaW5lcyBoZXJlLCBhZGp1c3RpbmcgaSBhcyBuZWVkZWRcbiAgICAgICAgICBmb3IgKGxldCBuZXh0SSA9IG5leHRUb0luc2VydC5uZXdMaW5lcy5sZW5ndGggLSAxOyBuZXh0SSA+PSAwOyBuZXh0SS0tKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmVzLnNldChpLS0sIG5leHRUb0luc2VydC5uZXdMaW5lc1tuZXh0SV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpKys7XG5cbiAgICAgICAgICAvLyBDcmVhdGUgaW5zZXJ0IGV2ZW50cyBmb3IgbGF0ZXJcbiAgICAgICAgICBpbnNlcnRFdmVudHMucHVzaCh7XG4gICAgICAgICAgICBpbmRleDogb3JpZ2luYWxMaW5lSW5kZXggKyAxLFxuICAgICAgICAgICAgYW1vdW50OiBuZXh0VG9JbnNlcnQubmV3TGluZXMubGVuZ3RoXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb3VudEluc2VydGVkU29GYXIgKz0gbmV4dFRvSW5zZXJ0Lm5ld0xpbmVzLmxlbmd0aDtcbiAgICAgICAgICBuZXh0VG9JbnNlcnQgPSB0b0luc2VydFsrK25leHRUb0luc2VydEluZGV4XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxpbmVzLnNldChpLCBvcmlnaW5hbExpbmVzW29yaWdpbmFsTGluZUluZGV4LS1dKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgbWFya2Vyc1xuICAgICAgbGV0IGluc2VydENvdW50RW1pdHRlZCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gaW5zZXJ0RXZlbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGluc2VydEV2ZW50c1tpXS5pbmRleCArPSBpbnNlcnRDb3VudEVtaXR0ZWQ7XG4gICAgICAgIHRoaXMubGluZXMub25JbnNlcnRFbWl0dGVyLmZpcmUoaW5zZXJ0RXZlbnRzW2ldKTtcbiAgICAgICAgaW5zZXJ0Q291bnRFbWl0dGVkICs9IGluc2VydEV2ZW50c1tpXS5hbW91bnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBhbW91bnRUb1RyaW0gPSBNYXRoLm1heCgwLCBvcmlnaW5hbExpbmVzTGVuZ3RoICsgY291bnRUb0luc2VydCAtIHRoaXMubGluZXMubWF4TGVuZ3RoKTtcbiAgICAgIGlmIChhbW91bnRUb1RyaW0gPiAwKSB7XG4gICAgICAgIHRoaXMubGluZXMub25UcmltRW1pdHRlci5maXJlKGFtb3VudFRvVHJpbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zbGF0ZXMgYSBidWZmZXIgbGluZSB0byBhIHN0cmluZywgd2l0aCBvcHRpb25hbCBzdGFydCBhbmQgZW5kIGNvbHVtbnMuXG4gICAqIFdpZGUgY2hhcmFjdGVycyB3aWxsIGNvdW50IGFzIHR3byBjb2x1bW5zIGluIHRoZSByZXN1bHRpbmcgc3RyaW5nLiBUaGlzXG4gICAqIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgZ2V0dGluZyB0aGUgYWN0dWFsIHRleHQgdW5kZXJuZWF0aCB0aGUgcmF3IHNlbGVjdGlvblxuICAgKiBwb3NpdGlvbi5cbiAgICogQHBhcmFtIGxpbmVJbmRleCBUaGUgYWJzb2x1dGUgaW5kZXggb2YgdGhlIGxpbmUgYmVpbmcgdHJhbnNsYXRlZC5cbiAgICogQHBhcmFtIHRyaW1SaWdodCBXaGV0aGVyIHRvIHRyaW0gd2hpdGVzcGFjZSB0byB0aGUgcmlnaHQuXG4gICAqIEBwYXJhbSBzdGFydENvbCBUaGUgY29sdW1uIHRvIHN0YXJ0IGF0LlxuICAgKiBAcGFyYW0gZW5kQ29sIFRoZSBjb2x1bW4gdG8gZW5kIGF0LlxuICAgKi9cbiAgcHVibGljIHRyYW5zbGF0ZUJ1ZmZlckxpbmVUb1N0cmluZyhsaW5lSW5kZXg6IG51bWJlciwgdHJpbVJpZ2h0OiBib29sZWFuLCBzdGFydENvbDogbnVtYmVyID0gMCwgZW5kQ29sPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5saW5lcy5nZXQobGluZUluZGV4KTtcbiAgICBpZiAoIWxpbmUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGxpbmUudHJhbnNsYXRlVG9TdHJpbmcodHJpbVJpZ2h0LCBzdGFydENvbCwgZW5kQ29sKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRXcmFwcGVkUmFuZ2VGb3JMaW5lKHk6IG51bWJlcik6IHsgZmlyc3Q6IG51bWJlciwgbGFzdDogbnVtYmVyIH0ge1xuICAgIGxldCBmaXJzdCA9IHk7XG4gICAgbGV0IGxhc3QgPSB5O1xuICAgIC8vIFNjYW4gdXB3YXJkcyBmb3Igd3JhcHBlZCBsaW5lc1xuICAgIHdoaWxlIChmaXJzdCA+IDAgJiYgdGhpcy5saW5lcy5nZXQoZmlyc3QpIS5pc1dyYXBwZWQpIHtcbiAgICAgIGZpcnN0LS07XG4gICAgfVxuICAgIC8vIFNjYW4gZG93bndhcmRzIGZvciB3cmFwcGVkIGxpbmVzXG4gICAgd2hpbGUgKGxhc3QgKyAxIDwgdGhpcy5saW5lcy5sZW5ndGggJiYgdGhpcy5saW5lcy5nZXQobGFzdCArIDEpIS5pc1dyYXBwZWQpIHtcbiAgICAgIGxhc3QrKztcbiAgICB9XG4gICAgcmV0dXJuIHsgZmlyc3QsIGxhc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgdGFiIHN0b3BzLlxuICAgKiBAcGFyYW0gaSBUaGUgaW5kZXggdG8gc3RhcnQgc2V0dGluZyB1cCB0YWIgc3RvcHMgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzZXR1cFRhYlN0b3BzKGk/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoaSAhPT0gbnVsbCAmJiBpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghdGhpcy50YWJzW2ldKSB7XG4gICAgICAgIGkgPSB0aGlzLnByZXZTdG9wKGkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRhYnMgPSB7fTtcbiAgICAgIGkgPSAwO1xuICAgIH1cblxuICAgIGZvciAoOyBpIDwgdGhpcy5fY29sczsgaSArPSB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnRhYlN0b3BXaWR0aCkge1xuICAgICAgdGhpcy50YWJzW2ldID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB0YWIgc3RvcCBmcm9tIHRoZSBnaXZlbiBwb3NpdGlvbiAoZGVmYXVsdCBpcyBjdXJyZW50KS5cbiAgICogQHBhcmFtIHggVGhlIHBvc2l0aW9uIHRvIG1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgdGFiIHN0b3AuXG4gICAqL1xuICBwdWJsaWMgcHJldlN0b3AoeD86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB4ID0gdGhpcy54O1xuICAgIH1cbiAgICB3aGlsZSAoIXRoaXMudGFic1stLXhdICYmIHggPiAwKTtcbiAgICByZXR1cm4geCA+PSB0aGlzLl9jb2xzID8gdGhpcy5fY29scyAtIDEgOiB4IDwgMCA/IDAgOiB4O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGN1cnNvciBvbmUgdGFiIHN0b3AgZm9yd2FyZCBmcm9tIHRoZSBnaXZlbiBwb3NpdGlvbiAoZGVmYXVsdCBpcyBjdXJyZW50KS5cbiAgICogQHBhcmFtIHggVGhlIHBvc2l0aW9uIHRvIG1vdmUgdGhlIGN1cnNvciBvbmUgdGFiIHN0b3AgZm9yd2FyZC5cbiAgICovXG4gIHB1YmxpYyBuZXh0U3RvcCh4PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAoeCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHggPSB0aGlzLng7XG4gICAgfVxuICAgIHdoaWxlICghdGhpcy50YWJzWysreF0gJiYgeCA8IHRoaXMuX2NvbHMpO1xuICAgIHJldHVybiB4ID49IHRoaXMuX2NvbHMgPyB0aGlzLl9jb2xzIC0gMSA6IHggPCAwID8gMCA6IHg7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIG1hcmtlcnMgb24gc2luZ2xlIGxpbmUuXG4gICAqIEBwYXJhbSB5IFRoZSBsaW5lIHRvIGNsZWFyLlxuICAgKi9cbiAgcHVibGljIGNsZWFyTWFya2Vycyh5OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0NsZWFyaW5nID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMubWFya2Vyc1tpXS5saW5lID09PSB5KSB7XG4gICAgICAgIHRoaXMubWFya2Vyc1tpXS5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMubWFya2Vycy5zcGxpY2UoaS0tLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faXNDbGVhcmluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBtYXJrZXJzIG9uIGFsbCBsaW5lc1xuICAgKi9cbiAgcHVibGljIGNsZWFyQWxsTWFya2VycygpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0NsZWFyaW5nID0gdHJ1ZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5tYXJrZXJzW2ldLmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMubWFya2Vycy5zcGxpY2UoaS0tLCAxKTtcbiAgICB9XG4gICAgdGhpcy5faXNDbGVhcmluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtlcih5OiBudW1iZXIpOiBNYXJrZXIge1xuICAgIGNvbnN0IG1hcmtlciA9IG5ldyBNYXJrZXIoeSk7XG4gICAgdGhpcy5tYXJrZXJzLnB1c2gobWFya2VyKTtcbiAgICBtYXJrZXIucmVnaXN0ZXIodGhpcy5saW5lcy5vblRyaW0oYW1vdW50ID0+IHtcbiAgICAgIG1hcmtlci5saW5lIC09IGFtb3VudDtcbiAgICAgIC8vIFRoZSBtYXJrZXIgc2hvdWxkIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGxpbmUgaXMgdHJpbW1lZCBmcm9tIHRoZSBidWZmZXJcbiAgICAgIGlmIChtYXJrZXIubGluZSA8IDApIHtcbiAgICAgICAgbWFya2VyLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgbWFya2VyLnJlZ2lzdGVyKHRoaXMubGluZXMub25JbnNlcnQoZXZlbnQgPT4ge1xuICAgICAgaWYgKG1hcmtlci5saW5lID49IGV2ZW50LmluZGV4KSB7XG4gICAgICAgIG1hcmtlci5saW5lICs9IGV2ZW50LmFtb3VudDtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgbWFya2VyLnJlZ2lzdGVyKHRoaXMubGluZXMub25EZWxldGUoZXZlbnQgPT4ge1xuICAgICAgLy8gRGVsZXRlIHRoZSBtYXJrZXIgaWYgaXQncyB3aXRoaW4gdGhlIHJhbmdlXG4gICAgICBpZiAobWFya2VyLmxpbmUgPj0gZXZlbnQuaW5kZXggJiYgbWFya2VyLmxpbmUgPCBldmVudC5pbmRleCArIGV2ZW50LmFtb3VudCkge1xuICAgICAgICBtYXJrZXIuZGlzcG9zZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaGlmdCB0aGUgbWFya2VyIGlmIGl0J3MgYWZ0ZXIgdGhlIGRlbGV0ZWQgcmFuZ2VcbiAgICAgIGlmIChtYXJrZXIubGluZSA+IGV2ZW50LmluZGV4KSB7XG4gICAgICAgIG1hcmtlci5saW5lIC09IGV2ZW50LmFtb3VudDtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgbWFya2VyLnJlZ2lzdGVyKG1hcmtlci5vbkRpc3Bvc2UoKCkgPT4gdGhpcy5fcmVtb3ZlTWFya2VyKG1hcmtlcikpKTtcbiAgICByZXR1cm4gbWFya2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlTWFya2VyKG1hcmtlcjogTWFya2VyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0NsZWFyaW5nKSB7XG4gICAgICB0aGlzLm1hcmtlcnMuc3BsaWNlKHRoaXMubWFya2Vycy5pbmRleE9mKG1hcmtlciksIDEpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDaGFyRGF0YSwgSUF0dHJpYnV0ZURhdGEsIElCdWZmZXJMaW5lLCBJQ2VsbERhdGEsIElFeHRlbmRlZEF0dHJzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEF0dHJpYnV0ZURhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0F0dHJpYnV0ZURhdGEnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcbmltcG9ydCB7IEF0dHJpYnV0ZXMsIEJnRmxhZ3MsIENIQVJfREFUQV9BVFRSX0lOREVYLCBDSEFSX0RBVEFfQ0hBUl9JTkRFWCwgQ0hBUl9EQVRBX1dJRFRIX0lOREVYLCBDb250ZW50LCBOVUxMX0NFTExfQ0hBUiwgTlVMTF9DRUxMX0NPREUsIE5VTExfQ0VMTF9XSURUSCwgV0hJVEVTUEFDRV9DRUxMX0NIQVIgfSBmcm9tICdjb21tb24vYnVmZmVyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyBzdHJpbmdGcm9tQ29kZVBvaW50IH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcblxuLyoqXG4gKiBidWZmZXIgbWVtb3J5IGxheW91dDpcbiAqXG4gKiAgIHwgICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgfCAgICAgICAgdWludDMyX3QgICAgICAgICB8ICAgICAgICB1aW50MzJfdCAgICAgICAgIHxcbiAqICAgfCAgICAgICAgICAgICBgY29udGVudGAgICAgICAgICAgICB8ICAgICAgICAgIGBGR2AgICAgICAgICAgIHwgICAgICAgICAgYEJHYCAgICAgICAgICAgfFxuICogICB8IHdjd2lkdGgoMikgY29tYigxKSBjb2RlcG9pbnQoMjEpIHwgZmxhZ3MoOCkgUig4KSBHKDgpIEIoOCkgfCBmbGFncyg4KSBSKDgpIEcoOCkgQig4KSB8XG4gKi9cblxuXG4vKiogdHlwZWQgYXJyYXkgc2xvdHMgdGFrZW4gYnkgb25lIGNlbGwgKi9cbmNvbnN0IENFTExfU0laRSA9IDM7XG5cbi8qKlxuICogQ2VsbCBtZW1iZXIgaW5kaWNlcy5cbiAqXG4gKiBEaXJlY3QgYWNjZXNzOlxuICogICAgYGNvbnRlbnQgPSBkYXRhW2NvbHVtbiAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF07YFxuICogICAgYGZnID0gZGF0YVtjb2x1bW4gKiBDRUxMX1NJWkUgKyBDZWxsLkZHXTtgXG4gKiAgICBgYmcgPSBkYXRhW2NvbHVtbiAqIENFTExfU0laRSArIENlbGwuQkddO2BcbiAqL1xuY29uc3QgZW51bSBDZWxsIHtcbiAgQ09OVEVOVCA9IDAsXG4gIEZHID0gMSwgLy8gY3VycmVudGx5IHNpbXBseSBob2xkcyBhbGwga25vd24gYXR0cnNcbiAgQkcgPSAyICAvLyBjdXJyZW50bHkgdW51c2VkXG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUVFJfREFUQSA9IE9iamVjdC5mcmVlemUobmV3IEF0dHJpYnV0ZURhdGEoKSk7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICRzdGFydEluZGV4ID0gMDtcblxuLyoqIEZhY3RvciB3aGVuIHRvIGNsZWFudXAgdW5kZXJseWluZyBhcnJheSBidWZmZXIgYWZ0ZXIgc2hyaW5raW5nLiAqL1xuY29uc3QgQ0xFQU5VUF9USFJFU0hPTEQgPSAyO1xuXG4vKipcbiAqIFR5cGVkIGFycmF5IGJhc2VkIGJ1ZmZlcmxpbmUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhlcmUgYXJlIDIgd2F5cyB0byBpbnNlcnQgZGF0YSBpbnRvIHRoZSBjZWxsIGJ1ZmZlcjpcbiAqIC0gYHNldENlbGxGcm9tQ29kZXBvaW50YCArIGBhZGRDb2RlcG9pbnRUb0NlbGxgXG4gKiAgIFVzZSB0aGVzZSBmb3IgZGF0YSB0aGF0IGlzIGFscmVhZHkgVVRGMzIuXG4gKiAgIFVzZWQgZHVyaW5nIG5vcm1hbCBpbnB1dCBpbiBgSW5wdXRIYW5kbGVyYCBmb3IgZmFzdGVyIGJ1ZmZlciBhY2Nlc3MuXG4gKiAtIGBzZXRDZWxsYFxuICogICBUaGlzIG1ldGhvZCB0YWtlcyBhIENlbGxEYXRhIG9iamVjdCBhbmQgc3RvcmVzIHRoZSBkYXRhIGluIHRoZSBidWZmZXIuXG4gKiAgIFVzZSBgQ2VsbERhdGEuZnJvbUNoYXJEYXRhYCB0byBjcmVhdGUgdGhlIENlbGxEYXRhIG9iamVjdCAoZS5nLiBmcm9tIEpTIHN0cmluZykuXG4gKlxuICogVG8gcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBidWZmZXIgdXNlIGVpdGhlciBvbmUgb2YgdGhlIHByaW1pdGl2ZSBtZXRob2RzXG4gKiAoaWYgb25seSBvbmUgcGFydGljdWxhciB2YWx1ZSBpcyBuZWVkZWQpIG9yIGBsb2FkQ2VsbGAuIEZvciBgbG9hZENlbGxgIGluIGEgbG9vcFxuICogbWVtb3J5IGFsbG9jcyAvIEdDIHByZXNzdXJlIGNhbiBiZSBncmVhdGx5IHJlZHVjZWQgYnkgcmV1c2luZyB0aGUgQ2VsbERhdGEgb2JqZWN0LlxuICovXG5leHBvcnQgY2xhc3MgQnVmZmVyTGluZSBpbXBsZW1lbnRzIElCdWZmZXJMaW5lIHtcbiAgcHJvdGVjdGVkIF9kYXRhOiBVaW50MzJBcnJheTtcbiAgcHJvdGVjdGVkIF9jb21iaW5lZDoge1tpbmRleDogbnVtYmVyXTogc3RyaW5nfSA9IHt9O1xuICBwcm90ZWN0ZWQgX2V4dGVuZGVkQXR0cnM6IHtbaW5kZXg6IG51bWJlcl06IElFeHRlbmRlZEF0dHJzIHwgdW5kZWZpbmVkfSA9IHt9O1xuICBwdWJsaWMgbGVuZ3RoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoY29sczogbnVtYmVyLCBmaWxsQ2VsbERhdGE/OiBJQ2VsbERhdGEsIHB1YmxpYyBpc1dyYXBwZWQ6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkoY29scyAqIENFTExfU0laRSk7XG4gICAgY29uc3QgY2VsbCA9IGZpbGxDZWxsRGF0YSB8fCBDZWxsRGF0YS5mcm9tQ2hhckRhdGEoWzAsIE5VTExfQ0VMTF9DSEFSLCBOVUxMX0NFTExfV0lEVEgsIE5VTExfQ0VMTF9DT0RFXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2xzOyArK2kpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbChpLCBjZWxsKTtcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBjb2xzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjZWxsIGRhdGEgQ2hhckRhdGEuXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDaGFyRGF0YSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdO1xuICAgIGNvbnN0IGNwID0gY29udGVudCAmIENvbnRlbnQuQ09ERVBPSU5UX01BU0s7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXSxcbiAgICAgIChjb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKVxuICAgICAgICA/IHRoaXMuX2NvbWJpbmVkW2luZGV4XVxuICAgICAgICA6IChjcCkgPyBzdHJpbmdGcm9tQ29kZVBvaW50KGNwKSA6ICcnLFxuICAgICAgY29udGVudCA+PiBDb250ZW50LldJRFRIX1NISUZULFxuICAgICAgKGNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spXG4gICAgICAgID8gdGhpcy5fY29tYmluZWRbaW5kZXhdLmNoYXJDb2RlQXQodGhpcy5fY29tYmluZWRbaW5kZXhdLmxlbmd0aCAtIDEpXG4gICAgICAgIDogY3BcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjZWxsIGRhdGEgZnJvbSBDaGFyRGF0YS5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBzZXQoaW5kZXg6IG51bWJlciwgdmFsdWU6IENoYXJEYXRhKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuRkddID0gdmFsdWVbQ0hBUl9EQVRBX0FUVFJfSU5ERVhdO1xuICAgIGlmICh2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0ubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5fY29tYmluZWRbaW5kZXhdID0gdmFsdWVbMV07XG4gICAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA9IGluZGV4IHwgQ29udGVudC5JU19DT01CSU5FRF9NQVNLIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID0gdmFsdWVbQ0hBUl9EQVRBX0NIQVJfSU5ERVhdLmNoYXJDb2RlQXQoMCkgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcHJpbWl0aXZlIGdldHRlcnNcbiAgICogdXNlIHRoZXNlIHdoZW4gb25seSBvbmUgdmFsdWUgaXMgbmVlZGVkLCBvdGhlcndpc2UgdXNlIGBsb2FkQ2VsbGBcbiAgICovXG4gIHB1YmxpYyBnZXRXaWR0aChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPj4gQ29udGVudC5XSURUSF9TSElGVDtcbiAgfVxuXG4gIC8qKiBUZXN0IHdoZXRoZXIgY29udGVudCBoYXMgd2lkdGguICovXG4gIHB1YmxpYyBoYXNXaWR0aChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LldJRFRIX01BU0s7XG4gIH1cblxuICAvKiogR2V0IEZHIGNlbGwgY29tcG9uZW50LiAqL1xuICBwdWJsaWMgZ2V0RmcoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXTtcbiAgfVxuXG4gIC8qKiBHZXQgQkcgY2VsbCBjb21wb25lbnQuICovXG4gIHB1YmxpYyBnZXRCZyhpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlc3Qgd2hldGhlciBjb250YWlucyBhbnkgY2hhcnMuXG4gICAqIEJhc2ljYWxseSBhbiBlbXB0eSBoYXMgbm8gY29udGVudCwgYnV0IG90aGVyIGNlbGxzIG1pZ2h0IGRpZmZlciBpbiBGRy9CR1xuICAgKiBmcm9tIHJlYWwgZW1wdHkgY2VsbHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQ29udGVudChpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LkhBU19DT05URU5UX01BU0s7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvZGVwb2ludCBvZiB0aGUgY2VsbC5cbiAgICogVG8gYmUgaW4gbGluZSB3aXRoIGBjb2RlYCBpbiBDaGFyRGF0YSB0aGlzIGVpdGhlciByZXR1cm5zXG4gICAqIGEgc2luZ2xlIFVURjMyIGNvZGVwb2ludCBvciB0aGUgbGFzdCBjb2RlcG9pbnQgb2YgYSBjb21iaW5lZCBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29kZVBvaW50KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXTtcbiAgICBpZiAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbWJpbmVkW2luZGV4XS5jaGFyQ29kZUF0KHRoaXMuX2NvbWJpbmVkW2luZGV4XS5sZW5ndGggLSAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICB9XG5cbiAgLyoqIFRlc3Qgd2hldGhlciB0aGUgY2VsbCBjb250YWlucyBhIGNvbWJpbmVkIHN0cmluZy4gKi9cbiAgcHVibGljIGlzQ29tYmluZWQoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyBjb250ZW50IG9mIHRoZSBjZWxsLiAqL1xuICBwdWJsaWMgZ2V0U3RyaW5nKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXTtcbiAgICBpZiAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbWJpbmVkW2luZGV4XTtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKSB7XG4gICAgICByZXR1cm4gc3RyaW5nRnJvbUNvZGVQb2ludChjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSyk7XG4gICAgfVxuICAgIC8vIHJldHVybiBlbXB0eSBzdHJpbmcgZm9yIGVtcHR5IGNlbGxzXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqIEdldCBzdGF0ZSBvZiBwcm90ZWN0ZWQgZmxhZy4gKi9cbiAgcHVibGljIGlzUHJvdGVjdGVkKGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5CR10gJiBCZ0ZsYWdzLlBST1RFQ1RFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGRhdGEgYXQgYGluZGV4YCBpbnRvIGBjZWxsYC4gVGhpcyBpcyB1c2VkIHRvIGFjY2VzcyBjZWxscyBpbiBhIHdheSB0aGF0J3MgbW9yZSBmcmllbmRseVxuICAgKiB0byBHQyBhcyBpdCBzaWduaWZpY2FudGx5IHJlZHVjZWQgdGhlIGFtb3VudCBvZiBuZXcgb2JqZWN0cy9yZWZlcmVuY2VzIG5lZWRlZC5cbiAgICovXG4gIHB1YmxpYyBsb2FkQ2VsbChpbmRleDogbnVtYmVyLCBjZWxsOiBJQ2VsbERhdGEpOiBJQ2VsbERhdGEge1xuICAgICRzdGFydEluZGV4ID0gaW5kZXggKiBDRUxMX1NJWkU7XG4gICAgY2VsbC5jb250ZW50ID0gdGhpcy5fZGF0YVskc3RhcnRJbmRleCArIENlbGwuQ09OVEVOVF07XG4gICAgY2VsbC5mZyA9IHRoaXMuX2RhdGFbJHN0YXJ0SW5kZXggKyBDZWxsLkZHXTtcbiAgICBjZWxsLmJnID0gdGhpcy5fZGF0YVskc3RhcnRJbmRleCArIENlbGwuQkddO1xuICAgIGlmIChjZWxsLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIGNlbGwuY29tYmluZWREYXRhID0gdGhpcy5fY29tYmluZWRbaW5kZXhdO1xuICAgIH1cbiAgICBpZiAoY2VsbC5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSB7XG4gICAgICBjZWxsLmV4dGVuZGVkID0gdGhpcy5fZXh0ZW5kZWRBdHRyc1tpbmRleF0hO1xuICAgIH1cbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGF0YSBhdCBgaW5kZXhgIHRvIGBjZWxsYC5cbiAgICovXG4gIHB1YmxpYyBzZXRDZWxsKGluZGV4OiBudW1iZXIsIGNlbGw6IElDZWxsRGF0YSk6IHZvaWQge1xuICAgIGlmIChjZWxsLmNvbnRlbnQgJiBDb250ZW50LklTX0NPTUJJTkVEX01BU0spIHtcbiAgICAgIHRoaXMuX2NvbWJpbmVkW2luZGV4XSA9IGNlbGwuY29tYmluZWREYXRhO1xuICAgIH1cbiAgICBpZiAoY2VsbC5iZyAmIEJnRmxhZ3MuSEFTX0VYVEVOREVEKSB7XG4gICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2luZGV4XSA9IGNlbGwuZXh0ZW5kZWQ7XG4gICAgfVxuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID0gY2VsbC5jb250ZW50O1xuICAgIHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkZHXSA9IGNlbGwuZmc7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddID0gY2VsbC5iZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2VsbCBkYXRhIGZyb20gaW5wdXQgaGFuZGxlci5cbiAgICogU2luY2UgdGhlIGlucHV0IGhhbmRsZXIgc2VlIHRoZSBpbmNvbWluZyBjaGFycyBhcyBVVEYzMiBjb2RlcG9pbnRzLFxuICAgKiBpdCBnZXRzIGFuIG9wdGltaXplZCBhY2Nlc3MgbWV0aG9kLlxuICAgKi9cbiAgcHVibGljIHNldENlbGxGcm9tQ29kZXBvaW50KGluZGV4OiBudW1iZXIsIGNvZGVQb2ludDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBhdHRyczogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBpZiAoYXR0cnMuYmcgJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkge1xuICAgICAgdGhpcy5fZXh0ZW5kZWRBdHRyc1tpbmRleF0gPSBhdHRycy5leHRlbmRlZDtcbiAgICB9XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPSBjb2RlUG9pbnQgfCAod2lkdGggPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuRkddID0gYXR0cnMuZmc7XG4gICAgdGhpcy5fZGF0YVtpbmRleCAqIENFTExfU0laRSArIENlbGwuQkddID0gYXR0cnMuYmc7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29kZXBvaW50IHRvIGEgY2VsbCBmcm9tIGlucHV0IGhhbmRsZXIuXG4gICAqIER1cmluZyBpbnB1dCBzdGFnZSBjb21iaW5pbmcgY2hhcnMgd2l0aCBhIHdpZHRoIG9mIDAgZm9sbG93IGFuZCBzdGFja1xuICAgKiBvbnRvIGEgbGVhZGluZyBjaGFyLiBTaW5jZSB3ZSBhbHJlYWR5IHNldCB0aGUgYXR0cnNcbiAgICogYnkgdGhlIHByZXZpb3VzIGBzZXREYXRhRnJvbUNvZGVQb2ludGAgY2FsbCwgd2UgY2FuIG9taXQgaXQgaGVyZS5cbiAgICovXG4gIHB1YmxpYyBhZGRDb2RlcG9pbnRUb0NlbGwoaW5kZXg6IG51bWJlciwgY29kZVBvaW50OiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgY29udGVudCA9IHRoaXMuX2RhdGFbaW5kZXggKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdO1xuICAgIGlmIChjb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKSB7XG4gICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUgYSBjb21iaW5lZCBzdHJpbmcsIHNpbXBseSBhZGRcbiAgICAgIHRoaXMuX2NvbWJpbmVkW2luZGV4XSArPSBzdHJpbmdGcm9tQ29kZVBvaW50KGNvZGVQb2ludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSykge1xuICAgICAgICAvLyBub3JtYWwgY2FzZSBmb3IgY29tYmluaW5nIGNoYXJzOlxuICAgICAgICAvLyAgLSBtb3ZlIGN1cnJlbnQgbGVhZGluZyBjaGFyICsgbmV3IG9uZSBpbnRvIGNvbWJpbmVkIHN0cmluZ1xuICAgICAgICAvLyAgLSBzZXQgY29tYmluZWQgZmxhZ1xuICAgICAgICB0aGlzLl9jb21iaW5lZFtpbmRleF0gPSBzdHJpbmdGcm9tQ29kZVBvaW50KGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKSArIHN0cmluZ0Zyb21Db2RlUG9pbnQoY29kZVBvaW50KTtcbiAgICAgICAgY29udGVudCAmPSB+Q29udGVudC5DT0RFUE9JTlRfTUFTSzsgLy8gc2V0IGNvZGVwb2ludCBpbiBidWZmZXIgdG8gMFxuICAgICAgICBjb250ZW50IHw9IENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIC0gd2UgYWN0dWFsbHkgaGF2ZSBubyBkYXRhIGluIHRoZSBjZWxsIHlldFxuICAgICAgICAvLyBzaW1wbHkgc2V0IHRoZSBkYXRhIGluIHRoZSBjZWxsIGJ1ZmZlciB3aXRoIGEgd2lkdGggb2YgMVxuICAgICAgICBjb250ZW50ID0gY29kZVBvaW50IHwgKDEgPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh3aWR0aCkge1xuICAgICAgY29udGVudCAmPSB+Q29udGVudC5XSURUSF9NQVNLO1xuICAgICAgY29udGVudCB8PSB3aWR0aCA8PCBDb250ZW50LldJRFRIX1NISUZUO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhW2luZGV4ICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSA9IGNvbnRlbnQ7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0Q2VsbHMocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEpOiB2b2lkIHtcbiAgICBwb3MgJT0gdGhpcy5sZW5ndGg7XG5cbiAgICAvLyBoYW5kbGUgZnVsbHdpZHRoIGF0IHBvczogcmVzZXQgY2VsbCBvbmUgdG8gdGhlIGxlZnQgaWYgcG9zIGlzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHBvcyAmJiB0aGlzLmdldFdpZHRoKHBvcyAtIDEpID09PSAyKSB7XG4gICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KHBvcyAtIDEsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuXG4gICAgaWYgKG4gPCB0aGlzLmxlbmd0aCAtIHBvcykge1xuICAgICAgY29uc3QgY2VsbCA9IG5ldyBDZWxsRGF0YSgpO1xuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gcG9zIC0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChwb3MgKyBuICsgaSwgdGhpcy5sb2FkQ2VsbChwb3MgKyBpLCBjZWxsKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICB0aGlzLnNldENlbGwocG9zICsgaSwgZmlsbENlbGxEYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IHBvczsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsKGksIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaGFuZGxlIGZ1bGx3aWR0aCBhdCBsaW5lIGVuZDogcmVzZXQgbGFzdCBjZWxsIGlmIGl0IGlzIGZpcnN0IGNlbGwgb2YgYSB3aWRlIGNoYXJcbiAgICBpZiAodGhpcy5nZXRXaWR0aCh0aGlzLmxlbmd0aCAtIDEpID09PSAyKSB7XG4gICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KHRoaXMubGVuZ3RoIC0gMSwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlQ2VsbHMocG9zOiBudW1iZXIsIG46IG51bWJlciwgZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEpOiB2b2lkIHtcbiAgICBwb3MgJT0gdGhpcy5sZW5ndGg7XG4gICAgaWYgKG4gPCB0aGlzLmxlbmd0aCAtIHBvcykge1xuICAgICAgY29uc3QgY2VsbCA9IG5ldyBDZWxsRGF0YSgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAtIHBvcyAtIG47ICsraSkge1xuICAgICAgICB0aGlzLnNldENlbGwocG9zICsgaSwgdGhpcy5sb2FkQ2VsbChwb3MgKyBuICsgaSwgY2VsbCkpO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gbjsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsKGksIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgcG9zOlxuICAgIC8vIC0gcmVzZXQgcG9zLTEgaWYgd2lkZSBjaGFyXG4gICAgLy8gLSByZXNldCBwb3MgaWYgd2lkdGg9PTAgKHByZXZpb3VzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyKVxuICAgIGlmIChwb3MgJiYgdGhpcy5nZXRXaWR0aChwb3MgLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChwb3MgLSAxLCAwLCAxLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nZXRXaWR0aChwb3MpID09PSAwICYmICF0aGlzLmhhc0NvbnRlbnQocG9zKSkge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChwb3MsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlcGxhY2VDZWxscyhzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBmdWxsIGJyYW5jaGluZyBvbiByZXNwZWN0UHJvdGVjdD09dHJ1ZSwgaG9wZWZ1bGx5IGdldHRpbmcgZmFzdCBKSVQgZm9yIHN0YW5kYXJkIGNhc2VcbiAgICBpZiAocmVzcGVjdFByb3RlY3QpIHtcbiAgICAgIGlmIChzdGFydCAmJiB0aGlzLmdldFdpZHRoKHN0YXJ0IC0gMSkgPT09IDIgJiYgIXRoaXMuaXNQcm90ZWN0ZWQoc3RhcnQgLSAxKSkge1xuICAgICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KHN0YXJ0IC0gMSwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmdldFdpZHRoKGVuZCAtIDEpID09PSAyICYmICF0aGlzLmlzUHJvdGVjdGVkKGVuZCkpIHtcbiAgICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChlbmQsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQgICYmIHN0YXJ0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUHJvdGVjdGVkKHN0YXJ0KSkge1xuICAgICAgICAgIHRoaXMuc2V0Q2VsbChzdGFydCwgZmlsbENlbGxEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgc3RhcnQ6IHJlc2V0IGNlbGwgb25lIHRvIHRoZSBsZWZ0IGlmIHN0YXJ0IGlzIHNlY29uZCBjZWxsIG9mIGEgd2lkZSBjaGFyXG4gICAgaWYgKHN0YXJ0ICYmIHRoaXMuZ2V0V2lkdGgoc3RhcnQgLSAxKSA9PT0gMikge1xuICAgICAgdGhpcy5zZXRDZWxsRnJvbUNvZGVwb2ludChzdGFydCAtIDEsIDAsIDEsIGZpbGxDZWxsRGF0YSk7XG4gICAgfVxuICAgIC8vIGhhbmRsZSBmdWxsd2lkdGggYXQgbGFzdCBjZWxsICsgMTogcmVzZXQgdG8gZW1wdHkgY2VsbCBpZiBpdCBpcyBzZWNvbmQgcGFydCBvZiBhIHdpZGUgY2hhclxuICAgIGlmIChlbmQgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLmdldFdpZHRoKGVuZCAtIDEpID09PSAyKSB7XG4gICAgICB0aGlzLnNldENlbGxGcm9tQ29kZXBvaW50KGVuZCwgMCwgMSwgZmlsbENlbGxEYXRhKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoc3RhcnQgPCBlbmQgICYmIHN0YXJ0IDwgdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbChzdGFydCsrLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemUgQnVmZmVyTGluZSB0byBgY29sc2AgZmlsbGluZyBleGNlc3MgY2VsbHMgd2l0aCBgZmlsbENlbGxEYXRhYC5cbiAgICogVGhlIHVuZGVybHlpbmcgYXJyYXkgYnVmZmVyIHdpbGwgbm90IGNoYW5nZSBpZiB0aGVyZSBpcyBzdGlsbCBlbm91Z2ggc3BhY2VcbiAgICogdG8gaG9sZCB0aGUgbmV3IGJ1ZmZlciBsaW5lIGRhdGEuXG4gICAqIFJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcsIHdoZXRoZXIgYSBgY2xlYW51cE1lbW9yeWAgY2FsbCB3b3VsZCBmcmVlXG4gICAqIGV4Y2VzcyBtZW1vcnkgKHRydWUgYWZ0ZXIgc2hyaW5raW5nID4gQ0xFQU5VUF9USFJFU0hPTEQpLlxuICAgKi9cbiAgcHVibGljIHJlc2l6ZShjb2xzOiBudW1iZXIsIGZpbGxDZWxsRGF0YTogSUNlbGxEYXRhKTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbHMgPT09IHRoaXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YS5sZW5ndGggKiA0ICogQ0xFQU5VUF9USFJFU0hPTEQgPCB0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCB1aW50MzJDZWxscyA9IGNvbHMgKiBDRUxMX1NJWkU7XG4gICAgaWYgKGNvbHMgPiB0aGlzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2RhdGEuYnVmZmVyLmJ5dGVMZW5ndGggPj0gdWludDMyQ2VsbHMgKiA0KSB7XG4gICAgICAgIC8vIG9wdGltaXphdGlvbjogYXZvaWQgYWxsb2MgYW5kIGRhdGEgY29weSBpZiBidWZmZXIgaGFzIGVub3VnaCByb29tXG4gICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkodGhpcy5fZGF0YS5idWZmZXIsIDAsIHVpbnQzMkNlbGxzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNsb3cgcGF0aDogbmV3IGFsbG9jIGFuZCBmdWxsIGRhdGEgY29weVxuICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHVpbnQzMkNlbGxzKTtcbiAgICAgICAgZGF0YS5zZXQodGhpcy5fZGF0YSk7XG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoOyBpIDwgY29sczsgKytpKSB7XG4gICAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvcHRpbWl6YXRpb246IGp1c3Qgc2hyaW5rIHRoZSB2aWV3IG9uIGV4aXN0aW5nIGJ1ZmZlclxuICAgICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEuc3ViYXJyYXkoMCwgdWludDMyQ2VsbHMpO1xuICAgICAgLy8gUmVtb3ZlIGFueSBjdXQgb2ZmIGNvbWJpbmVkIGRhdGFcbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9jb21iaW5lZCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qga2V5ID0gcGFyc2VJbnQoa2V5c1tpXSwgMTApO1xuICAgICAgICBpZiAoa2V5ID49IGNvbHMpIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5fY29tYmluZWRba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIGFueSBjdXQgb2ZmIGV4dGVuZGVkIGF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IGV4dEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLl9leHRlbmRlZEF0dHJzKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBwYXJzZUludChleHRLZXlzW2ldLCAxMCk7XG4gICAgICAgIGlmIChrZXkgPj0gY29scykge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLl9leHRlbmRlZEF0dHJzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBjb2xzO1xuICAgIHJldHVybiB1aW50MzJDZWxscyAqIDQgKiBDTEVBTlVQX1RIUkVTSE9MRCA8IHRoaXMuX2RhdGEuYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCB1bmRlcmx5aW5nIGFycmF5IGJ1ZmZlci5cbiAgICogQSBjbGVhbnVwIHdpbGwgYmUgdHJpZ2dlcmVkIGlmIHRoZSBhcnJheSBidWZmZXIgZXhjZWVkcyB0aGUgYWN0dWFsIHVzZWRcbiAgICogbWVtb3J5IGJ5IGEgZmFjdG9yIG9mIENMRUFOVVBfVEhSRVNIT0xELlxuICAgKiBSZXR1cm5zIDAgb3IgMSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBjbGVhbnVwIGhhcHBlbmVkLlxuICAgKi9cbiAgcHVibGljIGNsZWFudXBNZW1vcnkoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fZGF0YS5sZW5ndGggKiA0ICogQ0xFQU5VUF9USFJFU0hPTEQgPCB0aGlzLl9kYXRhLmJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX2RhdGEubGVuZ3RoKTtcbiAgICAgIGRhdGEuc2V0KHRoaXMuX2RhdGEpO1xuICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKiogZmlsbCBhIGxpbmUgd2l0aCBmaWxsQ2hhckRhdGEgKi9cbiAgcHVibGljIGZpbGwoZmlsbENlbGxEYXRhOiBJQ2VsbERhdGEsIHJlc3BlY3RQcm90ZWN0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAvLyBmdWxsIGJyYW5jaGluZyBvbiByZXNwZWN0UHJvdGVjdD09dHJ1ZSwgaG9wZWZ1bGx5IGdldHRpbmcgZmFzdCBKSVQgZm9yIHN0YW5kYXJkIGNhc2VcbiAgICBpZiAocmVzcGVjdFByb3RlY3QpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoIXRoaXMuaXNQcm90ZWN0ZWQoaSkpIHtcbiAgICAgICAgICB0aGlzLnNldENlbGwoaSwgZmlsbENlbGxEYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9jb21iaW5lZCA9IHt9O1xuICAgIHRoaXMuX2V4dGVuZGVkQXR0cnMgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHRoaXMuc2V0Q2VsbChpLCBmaWxsQ2VsbERhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBhbHRlciB0byBhIGZ1bGwgY29weSBvZiBsaW5lICAqL1xuICBwdWJsaWMgY29weUZyb20obGluZTogQnVmZmVyTGluZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gbGluZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSBuZXcgVWludDMyQXJyYXkobGluZS5fZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVzZSBoaWdoIHNwZWVkIGNvcHkgaWYgbGVuZ3RocyBhcmUgZXF1YWxcbiAgICAgIHRoaXMuX2RhdGEuc2V0KGxpbmUuX2RhdGEpO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IGxpbmUubGVuZ3RoO1xuICAgIHRoaXMuX2NvbWJpbmVkID0ge307XG4gICAgZm9yIChjb25zdCBlbCBpbiBsaW5lLl9jb21iaW5lZCkge1xuICAgICAgdGhpcy5fY29tYmluZWRbZWxdID0gbGluZS5fY29tYmluZWRbZWxdO1xuICAgIH1cbiAgICB0aGlzLl9leHRlbmRlZEF0dHJzID0ge307XG4gICAgZm9yIChjb25zdCBlbCBpbiBsaW5lLl9leHRlbmRlZEF0dHJzKSB7XG4gICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2VsXSA9IGxpbmUuX2V4dGVuZGVkQXR0cnNbZWxdO1xuICAgIH1cbiAgICB0aGlzLmlzV3JhcHBlZCA9IGxpbmUuaXNXcmFwcGVkO1xuICB9XG5cbiAgLyoqIGNyZWF0ZSBhIG5ldyBjbG9uZSAqL1xuICBwdWJsaWMgY2xvbmUoKTogSUJ1ZmZlckxpbmUge1xuICAgIGNvbnN0IG5ld0xpbmUgPSBuZXcgQnVmZmVyTGluZSgwKTtcbiAgICBuZXdMaW5lLl9kYXRhID0gbmV3IFVpbnQzMkFycmF5KHRoaXMuX2RhdGEpO1xuICAgIG5ld0xpbmUubGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9jb21iaW5lZCkge1xuICAgICAgbmV3TGluZS5fY29tYmluZWRbZWxdID0gdGhpcy5fY29tYmluZWRbZWxdO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIGluIHRoaXMuX2V4dGVuZGVkQXR0cnMpIHtcbiAgICAgIG5ld0xpbmUuX2V4dGVuZGVkQXR0cnNbZWxdID0gdGhpcy5fZXh0ZW5kZWRBdHRyc1tlbF07XG4gICAgfVxuICAgIG5ld0xpbmUuaXNXcmFwcGVkID0gdGhpcy5pc1dyYXBwZWQ7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHJpbW1lZExlbmd0aCgpOiBudW1iZXIge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBpZiAoKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gJiBDb250ZW50LkhBU19DT05URU5UX01BU0spKSB7XG4gICAgICAgIHJldHVybiBpICsgKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF0gPj4gQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHVibGljIGdldE5vQmdUcmltbWVkTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIGlmICgodGhpcy5fZGF0YVtpICogQ0VMTF9TSVpFICsgQ2VsbC5DT05URU5UXSAmIENvbnRlbnQuSEFTX0NPTlRFTlRfTUFTSykgfHwgKHRoaXMuX2RhdGFbaSAqIENFTExfU0laRSArIENlbGwuQkddICYgQXR0cmlidXRlcy5DTV9NQVNLKSkge1xuICAgICAgICByZXR1cm4gaSArICh0aGlzLl9kYXRhW2kgKiBDRUxMX1NJWkUgKyBDZWxsLkNPTlRFTlRdID4+IENvbnRlbnQuV0lEVEhfU0hJRlQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBjb3B5Q2VsbHNGcm9tKHNyYzogQnVmZmVyTGluZSwgc3JjQ29sOiBudW1iZXIsIGRlc3RDb2w6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIGFwcGx5SW5SZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgc3JjRGF0YSA9IHNyYy5fZGF0YTtcbiAgICBpZiAoYXBwbHlJblJldmVyc2UpIHtcbiAgICAgIGZvciAobGV0IGNlbGwgPSBsZW5ndGggLSAxOyBjZWxsID49IDA7IGNlbGwtLSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IENFTExfU0laRTsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5fZGF0YVsoZGVzdENvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgaV0gPSBzcmNEYXRhWyhzcmNDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIGldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcmNEYXRhWyhzcmNDb2wgKyBjZWxsKSAqIENFTExfU0laRSArIENlbGwuQkddICYgQmdGbGFncy5IQVNfRVhURU5ERUQpIHtcbiAgICAgICAgICB0aGlzLl9leHRlbmRlZEF0dHJzW2Rlc3RDb2wgKyBjZWxsXSA9IHNyYy5fZXh0ZW5kZWRBdHRyc1tzcmNDb2wgKyBjZWxsXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBjZWxsID0gMDsgY2VsbCA8IGxlbmd0aDsgY2VsbCsrKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ0VMTF9TSVpFOyBpKyspIHtcbiAgICAgICAgICB0aGlzLl9kYXRhWyhkZXN0Q29sICsgY2VsbCkgKiBDRUxMX1NJWkUgKyBpXSA9IHNyY0RhdGFbKHNyY0NvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNyY0RhdGFbKHNyY0NvbCArIGNlbGwpICogQ0VMTF9TSVpFICsgQ2VsbC5CR10gJiBCZ0ZsYWdzLkhBU19FWFRFTkRFRCkge1xuICAgICAgICAgIHRoaXMuX2V4dGVuZGVkQXR0cnNbZGVzdENvbCArIGNlbGxdID0gc3JjLl9leHRlbmRlZEF0dHJzW3NyY0NvbCArIGNlbGxdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTW92ZSBhbnkgY29tYmluZWQgZGF0YSBvdmVyIGFzIG5lZWRlZCwgRklYTUU6IHJlcGVhdCBmb3IgZXh0ZW5kZWQgYXR0cnNcbiAgICBjb25zdCBzcmNDb21iaW5lZEtleXMgPSBPYmplY3Qua2V5cyhzcmMuX2NvbWJpbmVkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNyY0NvbWJpbmVkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcGFyc2VJbnQoc3JjQ29tYmluZWRLZXlzW2ldLCAxMCk7XG4gICAgICBpZiAoa2V5ID49IHNyY0NvbCkge1xuICAgICAgICB0aGlzLl9jb21iaW5lZFtrZXkgLSBzcmNDb2wgKyBkZXN0Q29sXSA9IHNyYy5fY29tYmluZWRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlcyB0aGUgYnVmZmVyIGxpbmUgdG8gYSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB0cmltUmlnaHQgV2hldGhlciB0byB0cmltIGFueSBlbXB0eSBjZWxscyBvbiB0aGUgcmlnaHQuXG4gICAqIEBwYXJhbSBzdGFydENvbCBUaGUgY29sdW1uIHRvIHN0YXJ0IHRoZSBzdHJpbmcgKDAtYmFzZWQgaW5jbHVzaXZlKS5cbiAgICogQHBhcmFtIGVuZENvbCBUaGUgY29sdW1uIHRvIGVuZCB0aGUgc3RyaW5nICgwLWJhc2VkIGV4Y2x1c2l2ZSkuXG4gICAqIEBwYXJhbSBvdXRDb2x1bW5zIGlmIHNwZWNpZmllZCwgdGhpcyBhcnJheSB3aWxsIGJlIGZpbGxlZCB3aXRoIGNvbHVtbiBudW1iZXJzIHN1Y2ggdGhhdFxuICAgKiBgcmV0dXJuZWRTdHJpbmdbaV1gIGlzIGRpc3BsYXllZCBhdCBgb3V0Q29sdW1uc1tpXWAgY29sdW1uLiBgb3V0Q29sdW1uc1tyZXR1cm5lZFN0cmluZy5sZW5ndGhdYFxuICAgKiBpcyB3aGVyZSB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyBgcmV0dXJuZWRTdHJpbmdgIHdpbGwgYmUgZGlzcGxheWVkLlxuICAgKlxuICAgKiBXaGVuIGEgc2luZ2xlIGNlbGwgaXMgdHJhbnNsYXRlZCB0byBtdWx0aXBsZSBVVEYtMTYgY29kZSB1bml0cyAoZS5nLiBzdXJyb2dhdGUgcGFpcikgaW4gdGhlXG4gICAqIHJldHVybmVkIHN0cmluZywgdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBgb3V0Q29sdW1uc2Agd2lsbCBoYXZlIHRoZSBzYW1lIGNvbHVtbiBudW1iZXIuXG4gICAqL1xuICBwdWJsaWMgdHJhbnNsYXRlVG9TdHJpbmcodHJpbVJpZ2h0PzogYm9vbGVhbiwgc3RhcnRDb2w/OiBudW1iZXIsIGVuZENvbD86IG51bWJlciwgb3V0Q29sdW1ucz86IG51bWJlcltdKTogc3RyaW5nIHtcbiAgICBzdGFydENvbCA9IHN0YXJ0Q29sID8/IDA7XG4gICAgZW5kQ29sID0gZW5kQ29sID8/IHRoaXMubGVuZ3RoO1xuICAgIGlmICh0cmltUmlnaHQpIHtcbiAgICAgIGVuZENvbCA9IE1hdGgubWluKGVuZENvbCwgdGhpcy5nZXRUcmltbWVkTGVuZ3RoKCkpO1xuICAgIH1cbiAgICBpZiAob3V0Q29sdW1ucykge1xuICAgICAgb3V0Q29sdW1ucy5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgd2hpbGUgKHN0YXJ0Q29sIDwgZW5kQ29sKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gdGhpcy5fZGF0YVtzdGFydENvbCAqIENFTExfU0laRSArIENlbGwuQ09OVEVOVF07XG4gICAgICBjb25zdCBjcCA9IGNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLO1xuICAgICAgY29uc3QgY2hhcnMgPSAoY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSykgPyB0aGlzLl9jb21iaW5lZFtzdGFydENvbF0gOiAoY3ApID8gc3RyaW5nRnJvbUNvZGVQb2ludChjcCkgOiBXSElURVNQQUNFX0NFTExfQ0hBUjtcbiAgICAgIHJlc3VsdCArPSBjaGFycztcbiAgICAgIGlmIChvdXRDb2x1bW5zKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBvdXRDb2x1bW5zLnB1c2goc3RhcnRDb2wpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydENvbCArPSAoY29udGVudCA+PiBDb250ZW50LldJRFRIX1NISUZUKSB8fCAxOyAvLyBhbHdheXMgYWR2YW5jZSBieSBhdCBsZWFzdCAxXG4gICAgfVxuICAgIGlmIChvdXRDb2x1bW5zKSB7XG4gICAgICBvdXRDb2x1bW5zLnB1c2goc3RhcnRDb2wpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElCdWZmZXJSYW5nZSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUxlbmd0aChyYW5nZTogSUJ1ZmZlclJhbmdlLCBidWZmZXJDb2xzOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAocmFuZ2Uuc3RhcnQueSA+IHJhbmdlLmVuZC55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBCdWZmZXIgcmFuZ2UgZW5kICgke3JhbmdlLmVuZC54fSwgJHtyYW5nZS5lbmQueX0pIGNhbm5vdCBiZSBiZWZvcmUgc3RhcnQgKCR7cmFuZ2Uuc3RhcnQueH0sICR7cmFuZ2Uuc3RhcnQueX0pYCk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlckNvbHMgKiAocmFuZ2UuZW5kLnkgLSByYW5nZS5zdGFydC55KSArIChyYW5nZS5lbmQueCAtIHJhbmdlLnN0YXJ0LnggKyAxKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgQnVmZmVyTGluZSB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyTGluZSc7XG5pbXBvcnQgeyBDaXJjdWxhckxpc3QgfSBmcm9tICdjb21tb24vQ2lyY3VsYXJMaXN0JztcbmltcG9ydCB7IElCdWZmZXJMaW5lLCBJQ2VsbERhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElOZXdMYXlvdXRSZXN1bHQge1xuICBsYXlvdXQ6IG51bWJlcltdO1xuICBjb3VudFJlbW92ZWQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYW5kIHJldHVybnMgaW5kZXhlcyB0byBiZSByZW1vdmVkIGFmdGVyIGEgcmVmbG93IGxhcmdlciBvY2N1cnMuIExpbmVzIHdpbGwgYmUgcmVtb3ZlZFxuICogd2hlbiBhIHdyYXBwZWQgbGluZSB1bndyYXBzLlxuICogQHBhcmFtIGxpbmVzIFRoZSBidWZmZXIgbGluZXMuXG4gKiBAcGFyYW0gb2xkQ29scyBUaGUgY29sdW1ucyBiZWZvcmUgcmVzaXplXG4gKiBAcGFyYW0gbmV3Q29scyBUaGUgY29sdW1ucyBhZnRlciByZXNpemUuXG4gKiBAcGFyYW0gYnVmZmVyQWJzb2x1dGVZIFRoZSBhYnNvbHV0ZSB5IHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IgKGJhc2VZICsgY3Vyc29yWSkuXG4gKiBAcGFyYW0gbnVsbENlbGwgVGhlIGNlbGwgZGF0YSB0byB1c2Ugd2hlbiBmaWxsaW5nIGluIGVtcHR5IGNlbGxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbG93TGFyZ2VyR2V0TGluZXNUb1JlbW92ZShsaW5lczogQ2lyY3VsYXJMaXN0PElCdWZmZXJMaW5lPiwgb2xkQ29sczogbnVtYmVyLCBuZXdDb2xzOiBudW1iZXIsIGJ1ZmZlckFic29sdXRlWTogbnVtYmVyLCBudWxsQ2VsbDogSUNlbGxEYXRhKTogbnVtYmVyW10ge1xuICAvLyBHYXRoZXIgYWxsIEJ1ZmZlckxpbmVzIHRoYXQgbmVlZCB0byBiZSByZW1vdmVkIGZyb20gdGhlIEJ1ZmZlciBoZXJlIHNvIHRoYXQgdGhleSBjYW4gYmVcbiAgLy8gYmF0Y2hlZCB1cCBhbmQgb25seSBjb21taXR0ZWQgb25jZVxuICBjb25zdCB0b1JlbW92ZTogbnVtYmVyW10gPSBbXTtcblxuICBmb3IgKGxldCB5ID0gMDsgeSA8IGxpbmVzLmxlbmd0aCAtIDE7IHkrKykge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgcm93IGlzIHdyYXBwZWRcbiAgICBsZXQgaSA9IHk7XG4gICAgbGV0IG5leHRMaW5lID0gbGluZXMuZ2V0KCsraSkgYXMgQnVmZmVyTGluZTtcbiAgICBpZiAoIW5leHRMaW5lLmlzV3JhcHBlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaG93IG1hbnkgbGluZXMgaXQncyB3cmFwcGVkIGZvclxuICAgIGNvbnN0IHdyYXBwZWRMaW5lczogQnVmZmVyTGluZVtdID0gW2xpbmVzLmdldCh5KSBhcyBCdWZmZXJMaW5lXTtcbiAgICB3aGlsZSAoaSA8IGxpbmVzLmxlbmd0aCAmJiBuZXh0TGluZS5pc1dyYXBwZWQpIHtcbiAgICAgIHdyYXBwZWRMaW5lcy5wdXNoKG5leHRMaW5lKTtcbiAgICAgIG5leHRMaW5lID0gbGluZXMuZ2V0KCsraSkgYXMgQnVmZmVyTGluZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVzZSBsaW5lcyBjb250YWluIHRoZSBjdXJzb3IgZG9uJ3QgdG91Y2ggdGhlbSwgdGhlIHByb2dyYW0gd2lsbCBoYW5kbGUgZml4aW5nIHVwIHdyYXBwZWRcbiAgICAvLyBsaW5lcyB3aXRoIHRoZSBjdXJzb3JcbiAgICBpZiAoYnVmZmVyQWJzb2x1dGVZID49IHkgJiYgYnVmZmVyQWJzb2x1dGVZIDwgaSkge1xuICAgICAgeSArPSB3cmFwcGVkTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENvcHkgYnVmZmVyIGRhdGEgdG8gbmV3IGxvY2F0aW9uc1xuICAgIGxldCBkZXN0TGluZUluZGV4ID0gMDtcbiAgICBsZXQgZGVzdENvbCA9IGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCh3cmFwcGVkTGluZXMsIGRlc3RMaW5lSW5kZXgsIG9sZENvbHMpO1xuICAgIGxldCBzcmNMaW5lSW5kZXggPSAxO1xuICAgIGxldCBzcmNDb2wgPSAwO1xuICAgIHdoaWxlIChzcmNMaW5lSW5kZXggPCB3cmFwcGVkTGluZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBzcmNUcmltbWVkVGluZUxlbmd0aCA9IGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCh3cmFwcGVkTGluZXMsIHNyY0xpbmVJbmRleCwgb2xkQ29scyk7XG4gICAgICBjb25zdCBzcmNSZW1haW5pbmdDZWxscyA9IHNyY1RyaW1tZWRUaW5lTGVuZ3RoIC0gc3JjQ29sO1xuICAgICAgY29uc3QgZGVzdFJlbWFpbmluZ0NlbGxzID0gbmV3Q29scyAtIGRlc3RDb2w7XG4gICAgICBjb25zdCBjZWxsc1RvQ29weSA9IE1hdGgubWluKHNyY1JlbWFpbmluZ0NlbGxzLCBkZXN0UmVtYWluaW5nQ2VsbHMpO1xuXG4gICAgICB3cmFwcGVkTGluZXNbZGVzdExpbmVJbmRleF0uY29weUNlbGxzRnJvbSh3cmFwcGVkTGluZXNbc3JjTGluZUluZGV4XSwgc3JjQ29sLCBkZXN0Q29sLCBjZWxsc1RvQ29weSwgZmFsc2UpO1xuXG4gICAgICBkZXN0Q29sICs9IGNlbGxzVG9Db3B5O1xuICAgICAgaWYgKGRlc3RDb2wgPT09IG5ld0NvbHMpIHtcbiAgICAgICAgZGVzdExpbmVJbmRleCsrO1xuICAgICAgICBkZXN0Q29sID0gMDtcbiAgICAgIH1cbiAgICAgIHNyY0NvbCArPSBjZWxsc1RvQ29weTtcbiAgICAgIGlmIChzcmNDb2wgPT09IHNyY1RyaW1tZWRUaW5lTGVuZ3RoKSB7XG4gICAgICAgIHNyY0xpbmVJbmRleCsrO1xuICAgICAgICBzcmNDb2wgPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgY2VsbCBpc24ndCB3aWRlLCBpZiBpdCBpcyBjb3B5IGl0IHRvIHRoZSBjdXJyZW50IGRlc3RcbiAgICAgIGlmIChkZXN0Q29sID09PSAwICYmIGRlc3RMaW5lSW5kZXggIT09IDApIHtcbiAgICAgICAgaWYgKHdyYXBwZWRMaW5lc1tkZXN0TGluZUluZGV4IC0gMV0uZ2V0V2lkdGgobmV3Q29scyAtIDEpID09PSAyKSB7XG4gICAgICAgICAgd3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXhdLmNvcHlDZWxsc0Zyb20od3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXggLSAxXSwgbmV3Q29scyAtIDEsIGRlc3RDb2wrKywgMSwgZmFsc2UpO1xuICAgICAgICAgIC8vIE51bGwgb3V0IHRoZSBlbmQgb2YgdGhlIGxhc3Qgcm93XG4gICAgICAgICAgd3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXggLSAxXS5zZXRDZWxsKG5ld0NvbHMgLSAxLCBudWxsQ2VsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBvdXQgcmVtYWluaW5nIGNlbGxzIG9yIGZyYWdtZW50cyBjb3VsZCByZW1haW47XG4gICAgd3JhcHBlZExpbmVzW2Rlc3RMaW5lSW5kZXhdLnJlcGxhY2VDZWxscyhkZXN0Q29sLCBuZXdDb2xzLCBudWxsQ2VsbCk7XG5cbiAgICAvLyBXb3JrIGJhY2t3YXJkcyBhbmQgcmVtb3ZlIGFueSByb3dzIGF0IHRoZSBlbmQgdGhhdCBvbmx5IGNvbnRhaW4gbnVsbCBjZWxsc1xuICAgIGxldCBjb3VudFRvUmVtb3ZlID0gMDtcbiAgICBmb3IgKGxldCBpID0gd3JhcHBlZExpbmVzLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGlmIChpID4gZGVzdExpbmVJbmRleCB8fCB3cmFwcGVkTGluZXNbaV0uZ2V0VHJpbW1lZExlbmd0aCgpID09PSAwKSB7XG4gICAgICAgIGNvdW50VG9SZW1vdmUrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb3VudFRvUmVtb3ZlID4gMCkge1xuICAgICAgdG9SZW1vdmUucHVzaCh5ICsgd3JhcHBlZExpbmVzLmxlbmd0aCAtIGNvdW50VG9SZW1vdmUpOyAvLyBpbmRleFxuICAgICAgdG9SZW1vdmUucHVzaChjb3VudFRvUmVtb3ZlKTtcbiAgICB9XG5cbiAgICB5ICs9IHdyYXBwZWRMaW5lcy5sZW5ndGggLSAxO1xuICB9XG4gIHJldHVybiB0b1JlbW92ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuZCByZXR1cm4gdGhlIG5ldyBsYXlvdXQgZm9yIGxpbmVzIGdpdmVuIGFuIGFycmF5IG9mIGluZGV4ZXMgdG8gYmUgcmVtb3ZlZC5cbiAqIEBwYXJhbSBsaW5lcyBUaGUgYnVmZmVyIGxpbmVzLlxuICogQHBhcmFtIHRvUmVtb3ZlIFRoZSBpbmRleGVzIHRvIHJlbW92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxvd0xhcmdlckNyZWF0ZU5ld0xheW91dChsaW5lczogQ2lyY3VsYXJMaXN0PElCdWZmZXJMaW5lPiwgdG9SZW1vdmU6IG51bWJlcltdKTogSU5ld0xheW91dFJlc3VsdCB7XG4gIGNvbnN0IGxheW91dDogbnVtYmVyW10gPSBbXTtcbiAgLy8gRmlyc3QgaXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IGFuZCBnZXQgdGhlIGFjdHVhbCBpbmRleGVzIHRvIHVzZSBmb3Igcm93c1xuICBsZXQgbmV4dFRvUmVtb3ZlSW5kZXggPSAwO1xuICBsZXQgbmV4dFRvUmVtb3ZlU3RhcnQgPSB0b1JlbW92ZVtuZXh0VG9SZW1vdmVJbmRleF07XG4gIGxldCBjb3VudFJlbW92ZWRTb0ZhciA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobmV4dFRvUmVtb3ZlU3RhcnQgPT09IGkpIHtcbiAgICAgIGNvbnN0IGNvdW50VG9SZW1vdmUgPSB0b1JlbW92ZVsrK25leHRUb1JlbW92ZUluZGV4XTtcblxuICAgICAgLy8gVGVsbCBtYXJrZXJzIHRoYXQgdGhlcmUgd2FzIGEgZGVsZXRpb25cbiAgICAgIGxpbmVzLm9uRGVsZXRlRW1pdHRlci5maXJlKHtcbiAgICAgICAgaW5kZXg6IGkgLSBjb3VudFJlbW92ZWRTb0ZhcixcbiAgICAgICAgYW1vdW50OiBjb3VudFRvUmVtb3ZlXG4gICAgICB9KTtcblxuICAgICAgaSArPSBjb3VudFRvUmVtb3ZlIC0gMTtcbiAgICAgIGNvdW50UmVtb3ZlZFNvRmFyICs9IGNvdW50VG9SZW1vdmU7XG4gICAgICBuZXh0VG9SZW1vdmVTdGFydCA9IHRvUmVtb3ZlWysrbmV4dFRvUmVtb3ZlSW5kZXhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXlvdXQucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsYXlvdXQsXG4gICAgY291bnRSZW1vdmVkOiBjb3VudFJlbW92ZWRTb0ZhclxuICB9O1xufVxuXG4vKipcbiAqIEFwcGxpZXMgYSBuZXcgbGF5b3V0IHRvIHRoZSBidWZmZXIuIFRoaXMgZXNzZW50aWFsbHkgZG9lcyB0aGUgc2FtZSBhcyBtYW55IHNwbGljZSBjYWxscyBidXQgaXQnc1xuICogZG9uZSBhbGwgYXQgb25jZSBpbiBhIHNpbmdsZSBpdGVyYXRpb24gdGhyb3VnaCB0aGUgbGlzdCBzaW5jZSBzcGxpY2UgaXMgdmVyeSBleHBlbnNpdmUuXG4gKiBAcGFyYW0gbGluZXMgVGhlIGJ1ZmZlciBsaW5lcy5cbiAqIEBwYXJhbSBuZXdMYXlvdXQgVGhlIG5ldyBsYXlvdXQgdG8gYXBwbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsb3dMYXJnZXJBcHBseU5ld0xheW91dChsaW5lczogQ2lyY3VsYXJMaXN0PElCdWZmZXJMaW5lPiwgbmV3TGF5b3V0OiBudW1iZXJbXSk6IHZvaWQge1xuICAvLyBSZWNvcmQgb3JpZ2luYWwgbGluZXMgc28gdGhleSBkb24ndCBnZXQgb3ZlcnJpZGRlbiB3aGVuIHdlIHJlYXJyYW5nZSB0aGUgbGlzdFxuICBjb25zdCBuZXdMYXlvdXRMaW5lczogQnVmZmVyTGluZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3TGF5b3V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgbmV3TGF5b3V0TGluZXMucHVzaChsaW5lcy5nZXQobmV3TGF5b3V0W2ldKSBhcyBCdWZmZXJMaW5lKTtcbiAgfVxuXG4gIC8vIFJlYXJyYW5nZSB0aGUgbGlzdFxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0xheW91dExpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGluZXMuc2V0KGksIG5ld0xheW91dExpbmVzW2ldKTtcbiAgfVxuICBsaW5lcy5sZW5ndGggPSBuZXdMYXlvdXQubGVuZ3RoO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5ldyBsaW5lIGxlbmd0aHMgZm9yIGEgZ2l2ZW4gd3JhcHBlZCBsaW5lLiBUaGUgcHVycG9zZSBvZiB0aGlzIGZ1bmN0aW9uIGl0IHRvIHByZS1cbiAqIGNvbXB1dGUgdGhlIHdyYXBwaW5nIHBvaW50cyBzaW5jZSB3aWRlIGNoYXJhY3RlcnMgbWF5IG5lZWQgdG8gYmUgd3JhcHBlZCBvbnRvIHRoZSBmb2xsb3dpbmcgbGluZS5cbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgbnVtYmVycyBvZiB3aGVyZSBlYWNoIGxpbmUgd3JhcHMgdG8sIHRoZSByZXN1bHRpbmcgYXJyYXlcbiAqIHdpbGwgb25seSBjb250YWluIHRoZSB2YWx1ZXMgYG5ld0NvbHNgICh3aGVuIHRoZSBsaW5lIGRvZXMgbm90IGVuZCB3aXRoIGEgd2lkZSBjaGFyYWN0ZXIpIGFuZFxuICogYG5ld0NvbHMgLSAxYCAod2hlbiB0aGUgbGluZSBkb2VzIGVuZCB3aXRoIGEgd2lkZSBjaGFyYWN0ZXIpLCBleGNlcHQgZm9yIHRoZSBsYXN0IHZhbHVlIHdoaWNoXG4gKiB3aWxsIGNvbnRhaW4gdGhlIHJlbWFpbmluZyBpdGVtcyB0byBmaWxsIHRoZSBsaW5lLlxuICpcbiAqIENhbGxpbmcgdGhpcyB3aXRoIGEgYG5ld0NvbHNgIHZhbHVlIG9mIGAxYCB3aWxsIGxvY2sgdXAuXG4gKlxuICogQHBhcmFtIHdyYXBwZWRMaW5lcyBUaGUgd3JhcHBlZCBsaW5lcyB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSBvbGRDb2xzIFRoZSBjb2x1bW5zIGJlZm9yZSByZXNpemUuXG4gKiBAcGFyYW0gbmV3Q29scyBUaGUgY29sdW1ucyBhZnRlciByZXNpemUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsb3dTbWFsbGVyR2V0TmV3TGluZUxlbmd0aHMod3JhcHBlZExpbmVzOiBCdWZmZXJMaW5lW10sIG9sZENvbHM6IG51bWJlciwgbmV3Q29sczogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBuZXdMaW5lTGVuZ3RoczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgY2VsbHNOZWVkZWQgPSB3cmFwcGVkTGluZXMubWFwKChsLCBpKSA9PiBnZXRXcmFwcGVkTGluZVRyaW1tZWRMZW5ndGgod3JhcHBlZExpbmVzLCBpLCBvbGRDb2xzKSkucmVkdWNlKChwLCBjKSA9PiBwICsgYyk7XG5cbiAgLy8gVXNlIHNyY0NvbCBhbmQgc3JjTGluZSB0byBmaW5kIHRoZSBuZXcgd3JhcHBpbmcgcG9pbnQsIHVzZSB0aGF0IHRvIGdldCB0aGUgY2VsbHNBdmFpbGFibGUgYW5kXG4gIC8vIGxpbmVzTmVlZGVkXG4gIGxldCBzcmNDb2wgPSAwO1xuICBsZXQgc3JjTGluZSA9IDA7XG4gIGxldCBjZWxsc0F2YWlsYWJsZSA9IDA7XG4gIHdoaWxlIChjZWxsc0F2YWlsYWJsZSA8IGNlbGxzTmVlZGVkKSB7XG4gICAgaWYgKGNlbGxzTmVlZGVkIC0gY2VsbHNBdmFpbGFibGUgPCBuZXdDb2xzKSB7XG4gICAgICAvLyBBZGQgdGhlIGZpbmFsIGxpbmUgYW5kIGV4aXQgdGhlIGxvb3BcbiAgICAgIG5ld0xpbmVMZW5ndGhzLnB1c2goY2VsbHNOZWVkZWQgLSBjZWxsc0F2YWlsYWJsZSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc3JjQ29sICs9IG5ld0NvbHM7XG4gICAgY29uc3Qgb2xkVHJpbW1lZExlbmd0aCA9IGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aCh3cmFwcGVkTGluZXMsIHNyY0xpbmUsIG9sZENvbHMpO1xuICAgIGlmIChzcmNDb2wgPiBvbGRUcmltbWVkTGVuZ3RoKSB7XG4gICAgICBzcmNDb2wgLT0gb2xkVHJpbW1lZExlbmd0aDtcbiAgICAgIHNyY0xpbmUrKztcbiAgICB9XG4gICAgY29uc3QgZW5kc1dpdGhXaWRlID0gd3JhcHBlZExpbmVzW3NyY0xpbmVdLmdldFdpZHRoKHNyY0NvbCAtIDEpID09PSAyO1xuICAgIGlmIChlbmRzV2l0aFdpZGUpIHtcbiAgICAgIHNyY0NvbC0tO1xuICAgIH1cbiAgICBjb25zdCBsaW5lTGVuZ3RoID0gZW5kc1dpdGhXaWRlID8gbmV3Q29scyAtIDEgOiBuZXdDb2xzO1xuICAgIG5ld0xpbmVMZW5ndGhzLnB1c2gobGluZUxlbmd0aCk7XG4gICAgY2VsbHNBdmFpbGFibGUgKz0gbGluZUxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBuZXdMaW5lTGVuZ3Rocztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdyYXBwZWRMaW5lVHJpbW1lZExlbmd0aChsaW5lczogQnVmZmVyTGluZVtdLCBpOiBudW1iZXIsIGNvbHM6IG51bWJlcik6IG51bWJlciB7XG4gIC8vIElmIHRoaXMgaXMgdGhlIGxhc3Qgcm93IGluIHRoZSB3cmFwcGVkIGxpbmUsIGdldCB0aGUgYWN0dWFsIHRyaW1tZWQgbGVuZ3RoXG4gIGlmIChpID09PSBsaW5lcy5sZW5ndGggLSAxKSB7XG4gICAgcmV0dXJuIGxpbmVzW2ldLmdldFRyaW1tZWRMZW5ndGgoKTtcbiAgfVxuICAvLyBEZXRlY3Qgd2hldGhlciB0aGUgZm9sbG93aW5nIGxpbmUgc3RhcnRzIHdpdGggYSB3aWRlIGNoYXJhY3RlciBhbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lXG4gIC8vIGlzIG51bGwsIGlmIHNvIHRoZW4gd2UgY2FuIGJlIHByZXR0eSBzdXJlIHRoZSBudWxsIGNoYXJhY3RlciBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgbGluZVxuICAvLyBsZW5ndGhdXG4gIGNvbnN0IGVuZHNJbk51bGwgPSAhKGxpbmVzW2ldLmhhc0NvbnRlbnQoY29scyAtIDEpKSAmJiBsaW5lc1tpXS5nZXRXaWR0aChjb2xzIC0gMSkgPT09IDE7XG4gIGNvbnN0IGZvbGxvd2luZ0xpbmVTdGFydHNXaXRoV2lkZSA9IGxpbmVzW2kgKyAxXS5nZXRXaWR0aCgwKSA9PT0gMjtcbiAgaWYgKGVuZHNJbk51bGwgJiYgZm9sbG93aW5nTGluZVN0YXJ0c1dpdGhXaWRlKSB7XG4gICAgcmV0dXJuIGNvbHMgLSAxO1xuICB9XG4gIHJldHVybiBjb2xzO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyJztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG4vKipcbiAqIFRoZSBCdWZmZXJTZXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHR3byBidWZmZXJzIHVzZWQgYnkgeHRlcm0gdGVybWluYWxzIChub3JtYWwgYW5kIGFsdCkgYW5kXG4gKiBwcm92aWRlcyBhbHNvIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWZmZXJTZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUJ1ZmZlclNldCB7XG4gIHByaXZhdGUgX25vcm1hbCE6IEJ1ZmZlcjtcbiAgcHJpdmF0ZSBfYWx0ITogQnVmZmVyO1xuICBwcml2YXRlIF9hY3RpdmVCdWZmZXIhOiBCdWZmZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25CdWZmZXJBY3RpdmF0ZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjx7YWN0aXZlQnVmZmVyOiBJQnVmZmVyLCBpbmFjdGl2ZUJ1ZmZlcjogSUJ1ZmZlcn0+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25CdWZmZXJBY3RpdmF0ZSA9IHRoaXMuX29uQnVmZmVyQWN0aXZhdGUuZXZlbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBCdWZmZXJTZXQgZm9yIHRoZSBnaXZlbiB0ZXJtaW5hbC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYnVmZmVyU2VydmljZTogSUJ1ZmZlclNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCdzY3JvbGxiYWNrJywgKCkgPT4gdGhpcy5yZXNpemUodGhpcy5fYnVmZmVyU2VydmljZS5jb2xzLCB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpKSk7XG4gICAgdGhpcy5yZWdpc3Rlcih0aGlzLl9vcHRpb25zU2VydmljZS5vblNwZWNpZmljT3B0aW9uQ2hhbmdlKCd0YWJTdG9wV2lkdGgnLCAoKSA9PiB0aGlzLnNldHVwVGFiU3RvcHMoKSkpO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX25vcm1hbCA9IG5ldyBCdWZmZXIodHJ1ZSwgdGhpcy5fb3B0aW9uc1NlcnZpY2UsIHRoaXMuX2J1ZmZlclNlcnZpY2UpO1xuICAgIHRoaXMuX25vcm1hbC5maWxsVmlld3BvcnRSb3dzKCk7XG5cbiAgICAvLyBUaGUgYWx0IGJ1ZmZlciBzaG91bGQgbmV2ZXIgaGF2ZSBzY3JvbGxiYWNrLlxuICAgIC8vIFNlZSBodHRwOi8vaW52aXNpYmxlLWlzbGFuZC5uZXQveHRlcm0vY3Rsc2Vxcy9jdGxzZXFzLmh0bWwjaDItVGhlLUFsdGVybmF0ZS1TY3JlZW4tQnVmZmVyXG4gICAgdGhpcy5fYWx0ID0gbmV3IEJ1ZmZlcihmYWxzZSwgdGhpcy5fb3B0aW9uc1NlcnZpY2UsIHRoaXMuX2J1ZmZlclNlcnZpY2UpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX25vcm1hbDtcbiAgICB0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlLmZpcmUoe1xuICAgICAgYWN0aXZlQnVmZmVyOiB0aGlzLl9ub3JtYWwsXG4gICAgICBpbmFjdGl2ZUJ1ZmZlcjogdGhpcy5fYWx0XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHVwVGFiU3RvcHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhbHQgQnVmZmVyIG9mIHRoZSBCdWZmZXJTZXRcbiAgICovXG4gIHB1YmxpYyBnZXQgYWx0KCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgYWN0aXZlIEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVCdWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbm9ybWFsIEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0XG4gICAqL1xuICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB0aGlzLl9ub3JtYWw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbm9ybWFsIEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0IGFzIGl0cyBjdXJyZW50bHkgYWN0aXZlIEJ1ZmZlclxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlTm9ybWFsQnVmZmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hY3RpdmVCdWZmZXIgPT09IHRoaXMuX25vcm1hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9ub3JtYWwueCA9IHRoaXMuX2FsdC54O1xuICAgIHRoaXMuX25vcm1hbC55ID0gdGhpcy5fYWx0Lnk7XG4gICAgLy8gVGhlIGFsdCBidWZmZXIgc2hvdWxkIGFsd2F5cyBiZSBjbGVhcmVkIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBub3JtYWxcbiAgICAvLyBidWZmZXIuIFRoaXMgZnJlZXMgdXAgbWVtb3J5IHNpbmNlIHRoZSBhbHQgYnVmZmVyIHNob3VsZCBhbHdheXMgYmUgbmV3XG4gICAgLy8gd2hlbiBhY3RpdmF0ZWQuXG4gICAgdGhpcy5fYWx0LmNsZWFyQWxsTWFya2VycygpO1xuICAgIHRoaXMuX2FsdC5jbGVhcigpO1xuICAgIHRoaXMuX2FjdGl2ZUJ1ZmZlciA9IHRoaXMuX25vcm1hbDtcbiAgICB0aGlzLl9vbkJ1ZmZlckFjdGl2YXRlLmZpcmUoe1xuICAgICAgYWN0aXZlQnVmZmVyOiB0aGlzLl9ub3JtYWwsXG4gICAgICBpbmFjdGl2ZUJ1ZmZlcjogdGhpcy5fYWx0XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWx0IEJ1ZmZlciBvZiB0aGUgQnVmZmVyU2V0IGFzIGl0cyBjdXJyZW50bHkgYWN0aXZlIEJ1ZmZlclxuICAgKi9cbiAgcHVibGljIGFjdGl2YXRlQWx0QnVmZmVyKGZpbGxBdHRyPzogSUF0dHJpYnV0ZURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYWN0aXZlQnVmZmVyID09PSB0aGlzLl9hbHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU2luY2UgdGhlIGFsdCBidWZmZXIgaXMgYWx3YXlzIGNsZWFyZWQgd2hlbiB0aGUgbm9ybWFsIGJ1ZmZlciBpc1xuICAgIC8vIGFjdGl2YXRlZCwgd2Ugd2FudCB0byBmaWxsIGl0IHdoZW4gc3dpdGNoaW5nIHRvIGl0LlxuICAgIHRoaXMuX2FsdC5maWxsVmlld3BvcnRSb3dzKGZpbGxBdHRyKTtcbiAgICB0aGlzLl9hbHQueCA9IHRoaXMuX25vcm1hbC54O1xuICAgIHRoaXMuX2FsdC55ID0gdGhpcy5fbm9ybWFsLnk7XG4gICAgdGhpcy5fYWN0aXZlQnVmZmVyID0gdGhpcy5fYWx0O1xuICAgIHRoaXMuX29uQnVmZmVyQWN0aXZhdGUuZmlyZSh7XG4gICAgICBhY3RpdmVCdWZmZXI6IHRoaXMuX2FsdCxcbiAgICAgIGluYWN0aXZlQnVmZmVyOiB0aGlzLl9ub3JtYWxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNpemVzIGJvdGggbm9ybWFsIGFuZCBhbHQgYnVmZmVycywgYWRqdXN0aW5nIHRoZWlyIGRhdGEgYWNjb3JkaW5nbHkuXG4gICAqIEBwYXJhbSBuZXdDb2xzIFRoZSBuZXcgbnVtYmVyIG9mIGNvbHVtbnMuXG4gICAqIEBwYXJhbSBuZXdSb3dzIFRoZSBuZXcgbnVtYmVyIG9mIHJvd3MuXG4gICAqL1xuICBwdWJsaWMgcmVzaXplKG5ld0NvbHM6IG51bWJlciwgbmV3Um93czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm9ybWFsLnJlc2l6ZShuZXdDb2xzLCBuZXdSb3dzKTtcbiAgICB0aGlzLl9hbHQucmVzaXplKG5ld0NvbHMsIG5ld1Jvd3MpO1xuICAgIHRoaXMuc2V0dXBUYWJTdG9wcyhuZXdDb2xzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgdGFiIHN0b3BzLlxuICAgKiBAcGFyYW0gaSBUaGUgaW5kZXggdG8gc3RhcnQgc2V0dGluZyB1cCB0YWIgc3RvcHMgZnJvbS5cbiAgICovXG4gIHB1YmxpYyBzZXR1cFRhYlN0b3BzKGk/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9ub3JtYWwuc2V0dXBUYWJTdG9wcyhpKTtcbiAgICB0aGlzLl9hbHQuc2V0dXBUYWJTdG9wcyhpKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBDaGFyRGF0YSwgSUNlbGxEYXRhLCBJRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5pbXBvcnQgeyBzdHJpbmdGcm9tQ29kZVBvaW50IH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcbmltcG9ydCB7IENIQVJfREFUQV9DSEFSX0lOREVYLCBDSEFSX0RBVEFfV0lEVEhfSU5ERVgsIENIQVJfREFUQV9BVFRSX0lOREVYLCBDb250ZW50IH0gZnJvbSAnY29tbW9uL2J1ZmZlci9Db25zdGFudHMnO1xuaW1wb3J0IHsgQXR0cmlidXRlRGF0YSwgRXh0ZW5kZWRBdHRycyB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQXR0cmlidXRlRGF0YSc7XG5cbi8qKlxuICogQ2VsbERhdGEgLSByZXByZXNlbnRzIGEgc2luZ2xlIENlbGwgaW4gdGhlIHRlcm1pbmFsIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENlbGxEYXRhIGV4dGVuZHMgQXR0cmlidXRlRGF0YSBpbXBsZW1lbnRzIElDZWxsRGF0YSB7XG4gIC8qKiBIZWxwZXIgdG8gY3JlYXRlIENlbGxEYXRhIGZyb20gQ2hhckRhdGEuICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IENlbGxEYXRhIHtcbiAgICBjb25zdCBvYmogPSBuZXcgQ2VsbERhdGEoKTtcbiAgICBvYmouc2V0RnJvbUNoYXJEYXRhKHZhbHVlKTtcbiAgICByZXR1cm4gb2JqO1xuICB9XG4gIC8qKiBQcmltaXRpdmVzIGZyb20gdGVybWluYWwgYnVmZmVyLiAqL1xuICBwdWJsaWMgY29udGVudCA9IDA7XG4gIHB1YmxpYyBmZyA9IDA7XG4gIHB1YmxpYyBiZyA9IDA7XG4gIHB1YmxpYyBleHRlbmRlZDogSUV4dGVuZGVkQXR0cnMgPSBuZXcgRXh0ZW5kZWRBdHRycygpO1xuICBwdWJsaWMgY29tYmluZWREYXRhID0gJyc7XG4gIC8qKiBXaGV0aGVyIGNlbGwgY29udGFpbnMgYSBjb21iaW5lZCBzdHJpbmcuICovXG4gIHB1YmxpYyBpc0NvbWJpbmVkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudCAmIENvbnRlbnQuSVNfQ09NQklORURfTUFTSztcbiAgfVxuICAvKiogV2lkdGggb2YgdGhlIGNlbGwuICovXG4gIHB1YmxpYyBnZXRXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQgPj4gQ29udGVudC5XSURUSF9TSElGVDtcbiAgfVxuICAvKiogSlMgc3RyaW5nIG9mIHRoZSBjb250ZW50LiAqL1xuICBwdWJsaWMgZ2V0Q2hhcnMoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYgQ29udGVudC5JU19DT01CSU5FRF9NQVNLKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZERhdGE7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKSB7XG4gICAgICByZXR1cm4gc3RyaW5nRnJvbUNvZGVQb2ludCh0aGlzLmNvbnRlbnQgJiBDb250ZW50LkNPREVQT0lOVF9NQVNLKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIC8qKlxuICAgKiBDb2RlcG9pbnQgb2YgY2VsbFxuICAgKiBOb3RlIHRoaXMgcmV0dXJucyB0aGUgVVRGMzIgY29kZXBvaW50IG9mIHNpbmdsZSBjaGFycyxcbiAgICogaWYgY29udGVudCBpcyBhIGNvbWJpbmVkIHN0cmluZyBpdCByZXR1cm5zIHRoZSBjb2RlcG9pbnRcbiAgICogb2YgdGhlIGxhc3QgY2hhciBpbiBzdHJpbmcgdG8gYmUgaW4gbGluZSB3aXRoIGNvZGUgaW4gQ2hhckRhdGEuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q29kZSgpOiBudW1iZXIge1xuICAgIHJldHVybiAodGhpcy5pc0NvbWJpbmVkKCkpXG4gICAgICA/IHRoaXMuY29tYmluZWREYXRhLmNoYXJDb2RlQXQodGhpcy5jb21iaW5lZERhdGEubGVuZ3RoIC0gMSlcbiAgICAgIDogdGhpcy5jb250ZW50ICYgQ29udGVudC5DT0RFUE9JTlRfTUFTSztcbiAgfVxuICAvKiogU2V0IGRhdGEgZnJvbSBDaGFyRGF0YSAqL1xuICBwdWJsaWMgc2V0RnJvbUNoYXJEYXRhKHZhbHVlOiBDaGFyRGF0YSk6IHZvaWQge1xuICAgIHRoaXMuZmcgPSB2YWx1ZVtDSEFSX0RBVEFfQVRUUl9JTkRFWF07XG4gICAgdGhpcy5iZyA9IDA7XG4gICAgbGV0IGNvbWJpbmVkID0gZmFsc2U7XG4gICAgLy8gc3Vycm9nYXRlcyBhbmQgY29tYmluZWQgc3RyaW5ncyBuZWVkIHNwZWNpYWwgdHJlYXRtZW50XG4gICAgaWYgKHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5sZW5ndGggPiAyKSB7XG4gICAgICBjb21iaW5lZCA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIGlmIHRoZSAyLWNoYXIgc3RyaW5nIGlzIGEgc3Vycm9nYXRlIGNyZWF0ZSBzaW5nbGUgY29kZXBvaW50XG4gICAgICAvLyBldmVyeXRoaW5nIGVsc2UgaXMgY29tYmluZWRcbiAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICBjb25zdCBzZWNvbmQgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF0uY2hhckNvZGVBdCgxKTtcbiAgICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICAgIHRoaXMuY29udGVudCA9ICgoY29kZSAtIDB4RDgwMCkgKiAweDQwMCArIHNlY29uZCAtIDB4REMwMCArIDB4MTAwMDApIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29tYmluZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudCA9IHZhbHVlW0NIQVJfREFUQV9DSEFSX0lOREVYXS5jaGFyQ29kZUF0KDApIHwgKHZhbHVlW0NIQVJfREFUQV9XSURUSF9JTkRFWF0gPDwgQ29udGVudC5XSURUSF9TSElGVCk7XG4gICAgfVxuICAgIGlmIChjb21iaW5lZCkge1xuICAgICAgdGhpcy5jb21iaW5lZERhdGEgPSB2YWx1ZVtDSEFSX0RBVEFfQ0hBUl9JTkRFWF07XG4gICAgICB0aGlzLmNvbnRlbnQgPSBDb250ZW50LklTX0NPTUJJTkVEX01BU0sgfCAodmFsdWVbQ0hBUl9EQVRBX1dJRFRIX0lOREVYXSA8PCBDb250ZW50LldJRFRIX1NISUZUKTtcbiAgICB9XG4gIH1cbiAgLyoqIEdldCBkYXRhIGFzIENoYXJEYXRhLiAqL1xuICBwdWJsaWMgZ2V0QXNDaGFyRGF0YSgpOiBDaGFyRGF0YSB7XG4gICAgcmV0dXJuIFt0aGlzLmZnLCB0aGlzLmdldENoYXJzKCksIHRoaXMuZ2V0V2lkdGgoKSwgdGhpcy5nZXRDb2RlKCldO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0NPTE9SID0gMDtcbmV4cG9ydCBjb25zdCBERUZBVUxUX0FUVFIgPSAoMCA8PCAxOCkgfCAoREVGQVVMVF9DT0xPUiA8PCA5KSB8ICgyNTYgPDwgMCk7XG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFQgPSAwO1xuXG5leHBvcnQgY29uc3QgQ0hBUl9EQVRBX0FUVFJfSU5ERVggPSAwO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9DSEFSX0lOREVYID0gMTtcbmV4cG9ydCBjb25zdCBDSEFSX0RBVEFfV0lEVEhfSU5ERVggPSAyO1xuZXhwb3J0IGNvbnN0IENIQVJfREFUQV9DT0RFX0lOREVYID0gMztcblxuLyoqXG4gKiBOdWxsIGNlbGwgLSBhIHJlYWwgZW1wdHkgY2VsbCAoY29udGFpbmluZyBub3RoaW5nKS5cbiAqIE5vdGUgdGhhdCBjb2RlIHNob3VsZCBhbHdheXMgYmUgMCBmb3IgYSBudWxsIGNlbGwgYXNcbiAqIHNldmVyYWwgdGVzdCBjb25kaXRpb24gb2YgdGhlIGJ1ZmZlciBsaW5lIHJlbHkgb24gdGhpcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5VTExfQ0VMTF9DSEFSID0gJyc7XG5leHBvcnQgY29uc3QgTlVMTF9DRUxMX1dJRFRIID0gMTtcbmV4cG9ydCBjb25zdCBOVUxMX0NFTExfQ09ERSA9IDA7XG5cbi8qKlxuICogV2hpdGVzcGFjZSBjZWxsLlxuICogVGhpcyBpcyBtZWFudCBhcyBhIHJlcGxhY2VtZW50IGZvciBlbXB0eSBjZWxscyB3aGVuIG5lZWRlZFxuICogZHVyaW5nIHJlbmRlcmluZyBsaW5lcyB0byBwcmVzZXJ2ZSBjb3JyZWN0IGFsaWdtZW50LlxuICovXG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX0NIQVIgPSAnICc7XG5leHBvcnQgY29uc3QgV0hJVEVTUEFDRV9DRUxMX1dJRFRIID0gMTtcbmV4cG9ydCBjb25zdCBXSElURVNQQUNFX0NFTExfQ09ERSA9IDMyO1xuXG4vKipcbiAqIEJpdG1hc2tzIGZvciBhY2Nlc3NpbmcgZGF0YSBpbiBgY29udGVudGAuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIENvbnRlbnQge1xuICAvKipcbiAgICogYml0IDEuLjIxICAgIGNvZGVwb2ludCwgbWF4IGFsbG93ZWQgaW4gVVRGMzIgaXMgMHgxMEZGRkYgKDIxIGJpdHMgdGFrZW4pXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBjb2RlcG9pbnQgPSBjb250ZW50ICYgQ29udGVudC5jb2RlcG9pbnRNYXNrO2BcbiAgICogICAgICAgICAgICAgIHdyaXRlOiAgYGNvbnRlbnQgfD0gY29kZXBvaW50ICYgQ29udGVudC5jb2RlcG9pbnRNYXNrO2BcbiAgICogICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgaWYgcHJlY29uZGl0aW9uIGBjb2RlcG9pbnQgPD0gMHgxMEZGRkZgIGlzIG1ldDpcbiAgICogICAgICAgICAgICAgICAgICAgICAgYGNvbnRlbnQgfD0gY29kZXBvaW50O2BcbiAgICovXG4gIENPREVQT0lOVF9NQVNLID0gMHgxRkZGRkYsXG5cbiAgLyoqXG4gICAqIGJpdCAyMiAgICAgICBmbGFnIGluZGljYXRpb24gd2hldGhlciBhIGNlbGwgY29udGFpbnMgY29tYmluZWQgY29udGVudFxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgaXNDb21iaW5lZCA9IGNvbnRlbnQgJiBDb250ZW50LmlzQ29tYmluZWQ7YFxuICAgKiAgICAgICAgICAgICAgc2V0OiAgICBgY29udGVudCB8PSBDb250ZW50LmlzQ29tYmluZWQ7YFxuICAgKiAgICAgICAgICAgICAgY2xlYXI6ICBgY29udGVudCAmPSB+Q29udGVudC5pc0NvbWJpbmVkO2BcbiAgICovXG4gIElTX0NPTUJJTkVEX01BU0sgPSAweDIwMDAwMCwgIC8vIDEgPDwgMjFcblxuICAvKipcbiAgICogYml0IDEuLjIyICAgIG1hc2sgdG8gY2hlY2sgd2hldGhlciBhIGNlbGwgY29udGFpbnMgYW55IHN0cmluZyBkYXRhXG4gICAqICAgICAgICAgICAgICB3ZSBuZWVkIHRvIGNoZWNrIGZvciBjb2RlcG9pbnQgYW5kIGlzQ29tYmluZWQgYml0cyB0byBzZWVcbiAgICogICAgICAgICAgICAgIHdoZXRoZXIgYSBjZWxsIGNvbnRhaW5zIGFueXRoaW5nXG4gICAqICAgICAgICAgICAgICByZWFkOiAgIGBpc0VtcHR5ID0gIShjb250ZW50ICYgQ29udGVudC5oYXNDb250ZW50KWBcbiAgICovXG4gIEhBU19DT05URU5UX01BU0sgPSAweDNGRkZGRixcblxuICAvKipcbiAgICogYml0IDIzLi4yNCAgIHdjd2lkdGggdmFsdWUgb2YgY2VsbCwgdGFrZXMgMiBiaXRzIChyYW5nZXMgZnJvbSAwLi4yKVxuICAgKiAgICAgICAgICAgICAgcmVhZDogICBgd2lkdGggPSAoY29udGVudCAmIENvbnRlbnQud2lkdGhNYXNrKSA+PiBDb250ZW50LndpZHRoU2hpZnQ7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBgaGFzV2lkdGggPSBjb250ZW50ICYgQ29udGVudC53aWR0aE1hc2s7YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICBhcyBsb25nIGFzIHdjd2lkdGggaXMgaGlnaGVzdCB2YWx1ZSBpbiBgY29udGVudGA6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGB3aWR0aCA9IGNvbnRlbnQgPj4gQ29udGVudC53aWR0aFNoaWZ0O2BcbiAgICogICAgICAgICAgICAgIHdyaXRlOiAgYGNvbnRlbnQgfD0gKHdpZHRoIDw8IENvbnRlbnQud2lkdGhTaGlmdCkgJiBDb250ZW50LndpZHRoTWFzaztgXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IGlmIHByZWNvbmRpdGlvbiBgMCA8PSB3aWR0aCA8PSAzYCBpcyBtZXQ6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGBjb250ZW50IHw9IHdpZHRoIDw8IENvbnRlbnQud2lkdGhTaGlmdDtgXG4gICAqL1xuICBXSURUSF9NQVNLID0gMHhDMDAwMDAsICAgLy8gMyA8PCAyMlxuICBXSURUSF9TSElGVCA9IDIyXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIEF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogYml0IDEuLjggICAgIGJsdWUgaW4gUkdCLCBjb2xvciBpbiBQMjU2IGFuZCBQMTZcbiAgICovXG4gIEJMVUVfTUFTSyA9IDB4RkYsXG4gIEJMVUVfU0hJRlQgPSAwLFxuICBQQ09MT1JfTUFTSyA9IDB4RkYsXG4gIFBDT0xPUl9TSElGVCA9IDAsXG5cbiAgLyoqXG4gICAqIGJpdCA5Li4xNiAgICBncmVlbiBpbiBSR0JcbiAgICovXG4gIEdSRUVOX01BU0sgPSAweEZGMDAsXG4gIEdSRUVOX1NISUZUID0gOCxcblxuICAvKipcbiAgICogYml0IDE3Li4yNCAgIHJlZCBpbiBSR0JcbiAgICovXG4gIFJFRF9NQVNLID0gMHhGRjAwMDAsXG4gIFJFRF9TSElGVCA9IDE2LFxuXG4gIC8qKlxuICAgKiBiaXQgMjUuLjI2ICAgY29sb3IgbW9kZTogREVGQVVMVCAoMCkgfCBQMTYgKDEpIHwgUDI1NiAoMikgfCBSR0IgKDMpXG4gICAqL1xuICBDTV9NQVNLID0gMHgzMDAwMDAwLFxuICBDTV9ERUZBVUxUID0gMCxcbiAgQ01fUDE2ID0gMHgxMDAwMDAwLFxuICBDTV9QMjU2ID0gMHgyMDAwMDAwLFxuICBDTV9SR0IgPSAweDMwMDAwMDAsXG5cbiAgLyoqXG4gICAqIGJpdCAxLi4yNCAgUkdCIHJvb21cbiAgICovXG4gIFJHQl9NQVNLID0gMHhGRkZGRkZcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRmdGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjMyXG4gICAqL1xuICBJTlZFUlNFID0gMHg0MDAwMDAwLFxuICBCT0xEID0gMHg4MDAwMDAwLFxuICBVTkRFUkxJTkUgPSAweDEwMDAwMDAwLFxuICBCTElOSyA9IDB4MjAwMDAwMDAsXG4gIElOVklTSUJMRSA9IDB4NDAwMDAwMDAsXG4gIFNUUklLRVRIUk9VR0ggPSAweDgwMDAwMDAwLFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBCZ0ZsYWdzIHtcbiAgLyoqXG4gICAqIGJpdCAyNy4uMzIgKHVwcGVyIDIgdW51c2VkKVxuICAgKi9cbiAgSVRBTElDID0gMHg0MDAwMDAwLFxuICBESU0gPSAweDgwMDAwMDAsXG4gIEhBU19FWFRFTkRFRCA9IDB4MTAwMDAwMDAsXG4gIFBST1RFQ1RFRCA9IDB4MjAwMDAwMDAsXG4gIE9WRVJMSU5FID0gMHg0MDAwMDAwMFxufVxuXG5leHBvcnQgY29uc3QgZW51bSBFeHRGbGFncyB7XG4gIC8qKlxuICAgKiBiaXQgMjcuLjI5XG4gICAqL1xuICBVTkRFUkxJTkVfU1RZTEUgPSAweDFDMDAwMDAwLFxuXG4gIC8qKlxuICAgKiBiaXQgMzAuLjMyXG4gICAqXG4gICAqIEFuIG9wdGlvbmFsIHZhcmlhbnQgZm9yIHRoZSBnbHlwaCwgdGhpcyBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBvZmZzZXQgdW5kZXJsaW5lcyBieSBhXG4gICAqIG51bWJlciBvZiBwaXhlbHMgdG8gY3JlYXRlIGEgcGVyZmVjdCBwYXR0ZXJuLlxuICAgKi9cbiAgVkFSSUFOVF9PRkZTRVQgPSAweEUwMDAwMDAwXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFVuZGVybGluZVN0eWxlIHtcbiAgTk9ORSA9IDAsXG4gIFNJTkdMRSA9IDEsXG4gIERPVUJMRSA9IDIsXG4gIENVUkxZID0gMyxcbiAgRE9UVEVEID0gNCxcbiAgREFTSEVEID0gNVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IGRpc3Bvc2VBcnJheSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUsIElNYXJrZXIgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTWFya2VyIGltcGxlbWVudHMgSU1hcmtlciB7XG4gIHByaXZhdGUgc3RhdGljIF9uZXh0SWQgPSAxO1xuXG4gIHB1YmxpYyBpc0Rpc3Bvc2VkOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3Bvc2FibGVzOiBJRGlzcG9zYWJsZVtdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaWQ6IG51bWJlciA9IE1hcmtlci5fbmV4dElkKys7XG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2lkOyB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25EaXNwb3NlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EaXNwb3NlID0gdGhpcy5fb25EaXNwb3NlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBsaW5lOiBudW1iZXJcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5saW5lID0gLTE7XG4gICAgLy8gRW1pdCBiZWZvcmUgc3VwZXIuZGlzcG9zZSBzdWNoIHRoYXQgZGlzcG9zZSBsaXN0ZW5lcnMgZ2V0IGEgY2hhbmdlIHRvIHJlYWN0XG4gICAgdGhpcy5fb25EaXNwb3NlLmZpcmUoKTtcbiAgICBkaXNwb3NlQXJyYXkodGhpcy5fZGlzcG9zYWJsZXMpO1xuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXI8VCBleHRlbmRzIElEaXNwb3NhYmxlPihkaXNwb3NhYmxlOiBUKTogVCB7XG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICByZXR1cm4gZGlzcG9zYWJsZTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQ2hhcnNldCB9IGZyb20gJ2NvbW1vbi9UeXBlcyc7XG5cbi8qKlxuICogVGhlIGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSB0aGUgdGVybWluYWwuIFRoZXNlIGVuYWJsZSBzZXZlcmFsIGxhbmd1YWdlc1xuICogdG8gYmUgcmVwcmVzZW50ZWQgd2l0aGluIHRoZSB0ZXJtaW5hbCB3aXRoIG9ubHkgOC1iaXQgZW5jb2RpbmcuIFNlZSBJU08gMjAyMlxuICogZm9yIGEgZGlzY3Vzc2lvbiBvbiBjaGFyYWN0ZXIgc2V0cy4gT25seSBWVDEwMCBjaGFyYWN0ZXIgc2V0cyBhcmUgc3VwcG9ydGVkLlxuICovXG5leHBvcnQgY29uc3QgQ0hBUlNFVFM6IHsgW2tleTogc3RyaW5nXTogSUNoYXJzZXQgfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBzZXQsIFVTLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9DSEFSU0VUOiBJQ2hhcnNldCB8IHVuZGVmaW5lZCA9IENIQVJTRVRTWydCJ107XG5cbi8qKlxuICogREVDIFNwZWNpYWwgQ2hhcmFjdGVyIGFuZCBMaW5lIERyYXdpbmcgU2V0LlxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQxMDItdWcvdGFibGU1LTEzLmh0bWxcbiAqIEEgbG90IG9mIGN1cnNlcyBhcHBzIHVzZSB0aGlzIGlmIHRoZXkgc2VlIFRFUk09eHRlcm0uXG4gKiB0ZXN0aW5nOiBlY2hvIC1lICdcXGUoMGFcXGUoQidcbiAqIFRoZSB4dGVybSBvdXRwdXQgc29tZXRpbWVzIHNlZW1zIHRvIGNvbmZsaWN0IHdpdGggdGhlXG4gKiByZWZlcmVuY2UgYWJvdmUuIHh0ZXJtIHNlZW1zIGluIGxpbmUgd2l0aCB0aGUgcmVmZXJlbmNlXG4gKiB3aGVuIHJ1bm5pbmcgdnR0ZXN0IGhvd2V2ZXIuXG4gKiBUaGUgdGFibGUgYmVsb3cgbm93IHVzZXMgeHRlcm0ncyBvdXRwdXQgZnJvbSB2dHRlc3QuXG4gKi9cbkNIQVJTRVRTWycwJ10gPSB7XG4gICdgJzogJ1xcdTI1YzYnLCAvLyAn4peGJ1xuICAnYSc6ICdcXHUyNTkyJywgLy8gJ+KWkidcbiAgJ2InOiAnXFx1MjQwOScsIC8vICfikIknIChIVClcbiAgJ2MnOiAnXFx1MjQwYycsIC8vICfikIwnIChGRilcbiAgJ2QnOiAnXFx1MjQwZCcsIC8vICfikI0nIChDUilcbiAgJ2UnOiAnXFx1MjQwYScsIC8vICfikIonIChMRilcbiAgJ2YnOiAnXFx1MDBiMCcsIC8vICfCsCdcbiAgJ2cnOiAnXFx1MDBiMScsIC8vICfCsSdcbiAgJ2gnOiAnXFx1MjQyNCcsIC8vICfikKQnIChOTClcbiAgJ2knOiAnXFx1MjQwYicsIC8vICfikIsnIChWVClcbiAgJ2onOiAnXFx1MjUxOCcsIC8vICfilJgnXG4gICdrJzogJ1xcdTI1MTAnLCAvLyAn4pSQJ1xuICAnbCc6ICdcXHUyNTBjJywgLy8gJ+KUjCdcbiAgJ20nOiAnXFx1MjUxNCcsIC8vICfilJQnXG4gICduJzogJ1xcdTI1M2MnLCAvLyAn4pS8J1xuICAnbyc6ICdcXHUyM2JhJywgLy8gJ+KOuidcbiAgJ3AnOiAnXFx1MjNiYicsIC8vICfijrsnXG4gICdxJzogJ1xcdTI1MDAnLCAvLyAn4pSAJ1xuICAncic6ICdcXHUyM2JjJywgLy8gJ+KOvCdcbiAgJ3MnOiAnXFx1MjNiZCcsIC8vICfijr0nXG4gICd0JzogJ1xcdTI1MWMnLCAvLyAn4pScJ1xuICAndSc6ICdcXHUyNTI0JywgLy8gJ+KUpCdcbiAgJ3YnOiAnXFx1MjUzNCcsIC8vICfilLQnXG4gICd3JzogJ1xcdTI1MmMnLCAvLyAn4pSsJ1xuICAneCc6ICdcXHUyNTAyJywgLy8gJ+KUgidcbiAgJ3knOiAnXFx1MjI2NCcsIC8vICfiiaQnXG4gICd6JzogJ1xcdTIyNjUnLCAvLyAn4omlJ1xuICAneyc6ICdcXHUwM2MwJywgLy8gJ8+AJ1xuICAnfCc6ICdcXHUyMjYwJywgLy8gJ+KJoCdcbiAgJ30nOiAnXFx1MDBhMycsIC8vICfCoydcbiAgJ34nOiAnXFx1MDBiNycgIC8vICfCtydcbn07XG5cbi8qKlxuICogQnJpdGlzaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKEFcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi01Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ0EnXSA9IHtcbiAgJyMnOiAnwqMnXG59O1xuXG4vKipcbiAqIFVuaXRlZCBTdGF0ZXMgY2hhcmFjdGVyIHNldFxuICogRVNDIChCXG4gKi9cbkNIQVJTRVRTWydCJ10gPSB1bmRlZmluZWQ7XG5cbi8qKlxuICogRHV0Y2ggY2hhcmFjdGVyIHNldFxuICogRVNDICg0XG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItNi5odG1sXG4gKi9cbkNIQVJTRVRTWyc0J10gPSB7XG4gICcjJzogJ8KjJyxcbiAgJ0AnOiAnwr4nLFxuICAnWyc6ICdpaicsXG4gICdcXFxcJzogJ8K9JyxcbiAgJ10nOiAnfCcsXG4gICd7JzogJ8KoJyxcbiAgJ3wnOiAnZicsXG4gICd9JzogJ8K8JyxcbiAgJ34nOiAnwrQnXG59O1xuXG4vKipcbiAqIEZpbm5pc2ggY2hhcmFjdGVyIHNldFxuICogRVNDIChDIG9yIEVTQyAoNVxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTcuaHRtbFxuICovXG5DSEFSU0VUU1snQyddID1cbkNIQVJTRVRTWyc1J10gPSB7XG4gICdbJzogJ8OEJyxcbiAgJ1xcXFwnOiAnw5YnLFxuICAnXSc6ICfDhScsXG4gICdeJzogJ8OcJyxcbiAgJ2AnOiAnw6knLFxuICAneyc6ICfDpCcsXG4gICd8JzogJ8O2JyxcbiAgJ30nOiAnw6UnLFxuICAnfic6ICfDvCdcbn07XG5cbi8qKlxuICogRnJlbmNoIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoUlxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTguaHRtbFxuICovXG5DSEFSU0VUU1snUiddID0ge1xuICAnIyc6ICfCoycsXG4gICdAJzogJ8OgJyxcbiAgJ1snOiAnwrAnLFxuICAnXFxcXCc6ICfDpycsXG4gICddJzogJ8KnJyxcbiAgJ3snOiAnw6knLFxuICAnfCc6ICfDuScsXG4gICd9JzogJ8OoJyxcbiAgJ34nOiAnwqgnXG59O1xuXG4vKipcbiAqIEZyZW5jaCBDYW5hZGlhbiBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKFFcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi05Lmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ1EnXSA9IHtcbiAgJ0AnOiAnw6AnLFxuICAnWyc6ICfDoicsXG4gICdcXFxcJzogJ8OnJyxcbiAgJ10nOiAnw6onLFxuICAnXic6ICfDricsXG4gICdgJzogJ8O0JyxcbiAgJ3snOiAnw6knLFxuICAnfCc6ICfDuScsXG4gICd9JzogJ8OoJyxcbiAgJ34nOiAnw7snXG59O1xuXG4vKipcbiAqIEdlcm1hbiBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKEtcbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi0xMC5odG1sXG4gKi9cbkNIQVJTRVRTWydLJ10gPSB7XG4gICdAJzogJ8KnJyxcbiAgJ1snOiAnw4QnLFxuICAnXFxcXCc6ICfDlicsXG4gICddJzogJ8OcJyxcbiAgJ3snOiAnw6QnLFxuICAnfCc6ICfDticsXG4gICd9JzogJ8O8JyxcbiAgJ34nOiAnw58nXG59O1xuXG4vKipcbiAqIEl0YWxpYW4gY2hhcmFjdGVyIHNldFxuICogRVNDIChZXG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTEuaHRtbFxuICovXG5DSEFSU0VUU1snWSddID0ge1xuICAnIyc6ICfCoycsXG4gICdAJzogJ8KnJyxcbiAgJ1snOiAnwrAnLFxuICAnXFxcXCc6ICfDpycsXG4gICddJzogJ8OpJyxcbiAgJ2AnOiAnw7knLFxuICAneyc6ICfDoCcsXG4gICd8JzogJ8OyJyxcbiAgJ30nOiAnw6gnLFxuICAnfic6ICfDrCdcbn07XG5cbi8qKlxuICogTm9yd2VnaWFuL0RhbmlzaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKEUgb3IgRVNDICg2XG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTIuaHRtbFxuICovXG5DSEFSU0VUU1snRSddID1cbkNIQVJTRVRTWyc2J10gPSB7XG4gICdAJzogJ8OEJyxcbiAgJ1snOiAnw4YnLFxuICAnXFxcXCc6ICfDmCcsXG4gICddJzogJ8OFJyxcbiAgJ14nOiAnw5wnLFxuICAnYCc6ICfDpCcsXG4gICd7JzogJ8OmJyxcbiAgJ3wnOiAnw7gnLFxuICAnfSc6ICfDpScsXG4gICd+JzogJ8O8J1xufTtcblxuLyoqXG4gKiBTcGFuaXNoIGNoYXJhY3RlciBzZXRcbiAqIEVTQyAoWlxuICogUmVmZXJlbmNlOiBodHRwOi8vdnQxMDAubmV0L2RvY3MvdnQyMjAtcm0vdGFibGUyLTEzLmh0bWxcbiAqL1xuQ0hBUlNFVFNbJ1onXSA9IHtcbiAgJyMnOiAnwqMnLFxuICAnQCc6ICfCpycsXG4gICdbJzogJ8KhJyxcbiAgJ1xcXFwnOiAnw5EnLFxuICAnXSc6ICfCvycsXG4gICd7JzogJ8KwJyxcbiAgJ3wnOiAnw7EnLFxuICAnfSc6ICfDpydcbn07XG5cbi8qKlxuICogU3dlZGlzaCBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKEggb3IgRVNDICg3XG4gKiBSZWZlcmVuY2U6IGh0dHA6Ly92dDEwMC5uZXQvZG9jcy92dDIyMC1ybS90YWJsZTItMTQuaHRtbFxuICovXG5DSEFSU0VUU1snSCddID1cbkNIQVJTRVRTWyc3J10gPSB7XG4gICdAJzogJ8OJJyxcbiAgJ1snOiAnw4QnLFxuICAnXFxcXCc6ICfDlicsXG4gICddJzogJ8OFJyxcbiAgJ14nOiAnw5wnLFxuICAnYCc6ICfDqScsXG4gICd7JzogJ8OkJyxcbiAgJ3wnOiAnw7YnLFxuICAnfSc6ICfDpScsXG4gICd+JzogJ8O8J1xufTtcblxuLyoqXG4gKiBTd2lzcyBjaGFyYWN0ZXIgc2V0XG4gKiBFU0MgKD1cbiAqIFJlZmVyZW5jZTogaHR0cDovL3Z0MTAwLm5ldC9kb2NzL3Z0MjIwLXJtL3RhYmxlMi0xNS5odG1sXG4gKi9cbkNIQVJTRVRTWyc9J10gPSB7XG4gICcjJzogJ8O5JyxcbiAgJ0AnOiAnw6AnLFxuICAnWyc6ICfDqScsXG4gICdcXFxcJzogJ8OnJyxcbiAgJ10nOiAnw6onLFxuICAnXic6ICfDricsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgJ18nOiAnw6gnLFxuICAnYCc6ICfDtCcsXG4gICd7JzogJ8OkJyxcbiAgJ3wnOiAnw7YnLFxuICAnfSc6ICfDvCcsXG4gICd+JzogJ8O7J1xufTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuLyoqXG4gKiBDMCBjb250cm9sIGNvZGVzXG4gKiBTZWUgPSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DMF9hbmRfQzFfY29udHJvbF9jb2Rlc1xuICovXG5leHBvcnQgbmFtZXNwYWNlIEMwIHtcbiAgLyoqIE51bGwgKENhcmV0ID0gXkAsIEMgPSBcXDApICovXG4gIGV4cG9ydCBjb25zdCBOVUwgPSAnXFx4MDAnO1xuICAvKiogU3RhcnQgb2YgSGVhZGluZyAoQ2FyZXQgPSBeQSkgKi9cbiAgZXhwb3J0IGNvbnN0IFNPSCA9ICdcXHgwMSc7XG4gIC8qKiBTdGFydCBvZiBUZXh0IChDYXJldCA9IF5CKSAqL1xuICBleHBvcnQgY29uc3QgU1RYID0gJ1xceDAyJztcbiAgLyoqIEVuZCBvZiBUZXh0IChDYXJldCA9IF5DKSAqL1xuICBleHBvcnQgY29uc3QgRVRYID0gJ1xceDAzJztcbiAgLyoqIEVuZCBvZiBUcmFuc21pc3Npb24gKENhcmV0ID0gXkQpICovXG4gIGV4cG9ydCBjb25zdCBFT1QgPSAnXFx4MDQnO1xuICAvKiogRW5xdWlyeSAoQ2FyZXQgPSBeRSkgKi9cbiAgZXhwb3J0IGNvbnN0IEVOUSA9ICdcXHgwNSc7XG4gIC8qKiBBY2tub3dsZWRnZSAoQ2FyZXQgPSBeRikgKi9cbiAgZXhwb3J0IGNvbnN0IEFDSyA9ICdcXHgwNic7XG4gIC8qKiBCZWxsIChDYXJldCA9IF5HLCBDID0gXFxhKSAqL1xuICBleHBvcnQgY29uc3QgQkVMID0gJ1xceDA3JztcbiAgLyoqIEJhY2tzcGFjZSAoQ2FyZXQgPSBeSCwgQyA9IFxcYikgKi9cbiAgZXhwb3J0IGNvbnN0IEJTICA9ICdcXHgwOCc7XG4gIC8qKiBDaGFyYWN0ZXIgVGFidWxhdGlvbiwgSG9yaXpvbnRhbCBUYWJ1bGF0aW9uIChDYXJldCA9IF5JLCBDID0gXFx0KSAqL1xuICBleHBvcnQgY29uc3QgSFQgID0gJ1xceDA5JztcbiAgLyoqIExpbmUgRmVlZCAoQ2FyZXQgPSBeSiwgQyA9IFxcbikgKi9cbiAgZXhwb3J0IGNvbnN0IExGICA9ICdcXHgwYSc7XG4gIC8qKiBMaW5lIFRhYnVsYXRpb24sIFZlcnRpY2FsIFRhYnVsYXRpb24gKENhcmV0ID0gXkssIEMgPSBcXHYpICovXG4gIGV4cG9ydCBjb25zdCBWVCAgPSAnXFx4MGInO1xuICAvKiogRm9ybSBGZWVkIChDYXJldCA9IF5MLCBDID0gXFxmKSAqL1xuICBleHBvcnQgY29uc3QgRkYgID0gJ1xceDBjJztcbiAgLyoqIENhcnJpYWdlIFJldHVybiAoQ2FyZXQgPSBeTSwgQyA9IFxccikgKi9cbiAgZXhwb3J0IGNvbnN0IENSICA9ICdcXHgwZCc7XG4gIC8qKiBTaGlmdCBPdXQgKENhcmV0ID0gXk4pICovXG4gIGV4cG9ydCBjb25zdCBTTyAgPSAnXFx4MGUnO1xuICAvKiogU2hpZnQgSW4gKENhcmV0ID0gXk8pICovXG4gIGV4cG9ydCBjb25zdCBTSSAgPSAnXFx4MGYnO1xuICAvKiogRGF0YSBMaW5rIEVzY2FwZSAoQ2FyZXQgPSBeUCkgKi9cbiAgZXhwb3J0IGNvbnN0IERMRSA9ICdcXHgxMCc7XG4gIC8qKiBEZXZpY2UgQ29udHJvbCBPbmUgKFhPTikgKENhcmV0ID0gXlEpICovXG4gIGV4cG9ydCBjb25zdCBEQzEgPSAnXFx4MTEnO1xuICAvKiogRGV2aWNlIENvbnRyb2wgVHdvIChDYXJldCA9IF5SKSAqL1xuICBleHBvcnQgY29uc3QgREMyID0gJ1xceDEyJztcbiAgLyoqIERldmljZSBDb250cm9sIFRocmVlIChYT0ZGKSAoQ2FyZXQgPSBeUykgKi9cbiAgZXhwb3J0IGNvbnN0IERDMyA9ICdcXHgxMyc7XG4gIC8qKiBEZXZpY2UgQ29udHJvbCBGb3VyIChDYXJldCA9IF5UKSAqL1xuICBleHBvcnQgY29uc3QgREM0ID0gJ1xceDE0JztcbiAgLyoqIE5lZ2F0aXZlIEFja25vd2xlZGdlIChDYXJldCA9IF5VKSAqL1xuICBleHBvcnQgY29uc3QgTkFLID0gJ1xceDE1JztcbiAgLyoqIFN5bmNocm9ub3VzIElkbGUgKENhcmV0ID0gXlYpICovXG4gIGV4cG9ydCBjb25zdCBTWU4gPSAnXFx4MTYnO1xuICAvKiogRW5kIG9mIFRyYW5zbWlzc2lvbiBCbG9jayAoQ2FyZXQgPSBeVykgKi9cbiAgZXhwb3J0IGNvbnN0IEVUQiA9ICdcXHgxNyc7XG4gIC8qKiBDYW5jZWwgKENhcmV0ID0gXlgpICovXG4gIGV4cG9ydCBjb25zdCBDQU4gPSAnXFx4MTgnO1xuICAvKiogRW5kIG9mIE1lZGl1bSAoQ2FyZXQgPSBeWSkgKi9cbiAgZXhwb3J0IGNvbnN0IEVNICA9ICdcXHgxOSc7XG4gIC8qKiBTdWJzdGl0dXRlIChDYXJldCA9IF5aKSAqL1xuICBleHBvcnQgY29uc3QgU1VCID0gJ1xceDFhJztcbiAgLyoqIEVzY2FwZSAoQ2FyZXQgPSBeWywgQyA9IFxcZSkgKi9cbiAgZXhwb3J0IGNvbnN0IEVTQyA9ICdcXHgxYic7XG4gIC8qKiBGaWxlIFNlcGFyYXRvciAoQ2FyZXQgPSBeXFwpICovXG4gIGV4cG9ydCBjb25zdCBGUyAgPSAnXFx4MWMnO1xuICAvKiogR3JvdXAgU2VwYXJhdG9yIChDYXJldCA9IF5dKSAqL1xuICBleHBvcnQgY29uc3QgR1MgID0gJ1xceDFkJztcbiAgLyoqIFJlY29yZCBTZXBhcmF0b3IgKENhcmV0ID0gXl4pICovXG4gIGV4cG9ydCBjb25zdCBSUyAgPSAnXFx4MWUnO1xuICAvKiogVW5pdCBTZXBhcmF0b3IgKENhcmV0ID0gXl8pICovXG4gIGV4cG9ydCBjb25zdCBVUyAgPSAnXFx4MWYnO1xuICAvKiogU3BhY2UgKi9cbiAgZXhwb3J0IGNvbnN0IFNQICA9ICdcXHgyMCc7XG4gIC8qKiBEZWxldGUgKENhcmV0ID0gXj8pICovXG4gIGV4cG9ydCBjb25zdCBERUwgPSAnXFx4N2YnO1xufVxuXG4vKipcbiAqIEMxIGNvbnRyb2wgY29kZXNcbiAqIFNlZSA9IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0MwX2FuZF9DMV9jb250cm9sX2NvZGVzXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgQzEge1xuICAvKiogcGFkZGluZyBjaGFyYWN0ZXIgKi9cbiAgZXhwb3J0IGNvbnN0IFBBRCA9ICdcXHg4MCc7XG4gIC8qKiBIaWdoIE9jdGV0IFByZXNldCAqL1xuICBleHBvcnQgY29uc3QgSE9QID0gJ1xceDgxJztcbiAgLyoqIEJyZWFrIFBlcm1pdHRlZCBIZXJlICovXG4gIGV4cG9ydCBjb25zdCBCUEggPSAnXFx4ODInO1xuICAvKiogTm8gQnJlYWsgSGVyZSAqL1xuICBleHBvcnQgY29uc3QgTkJIID0gJ1xceDgzJztcbiAgLyoqIEluZGV4ICovXG4gIGV4cG9ydCBjb25zdCBJTkQgPSAnXFx4ODQnO1xuICAvKiogTmV4dCBMaW5lICovXG4gIGV4cG9ydCBjb25zdCBORUwgPSAnXFx4ODUnO1xuICAvKiogU3RhcnQgb2YgU2VsZWN0ZWQgQXJlYSAqL1xuICBleHBvcnQgY29uc3QgU1NBID0gJ1xceDg2JztcbiAgLyoqIEVuZCBvZiBTZWxlY3RlZCBBcmVhICovXG4gIGV4cG9ydCBjb25zdCBFU0EgPSAnXFx4ODcnO1xuICAvKiogSG9yaXpvbnRhbCBUYWJ1bGF0aW9uIFNldCAqL1xuICBleHBvcnQgY29uc3QgSFRTID0gJ1xceDg4JztcbiAgLyoqIEhvcml6b250YWwgVGFidWxhdGlvbiBXaXRoIEp1c3RpZmljYXRpb24gKi9cbiAgZXhwb3J0IGNvbnN0IEhUSiA9ICdcXHg4OSc7XG4gIC8qKiBWZXJ0aWNhbCBUYWJ1bGF0aW9uIFNldCAqL1xuICBleHBvcnQgY29uc3QgVlRTID0gJ1xceDhhJztcbiAgLyoqIFBhcnRpYWwgTGluZSBEb3duICovXG4gIGV4cG9ydCBjb25zdCBQTEQgPSAnXFx4OGInO1xuICAvKiogUGFydGlhbCBMaW5lIFVwICovXG4gIGV4cG9ydCBjb25zdCBQTFUgPSAnXFx4OGMnO1xuICAvKiogUmV2ZXJzZSBJbmRleCAqL1xuICBleHBvcnQgY29uc3QgUkkgPSAnXFx4OGQnO1xuICAvKiogU2luZ2xlLVNoaWZ0IDIgKi9cbiAgZXhwb3J0IGNvbnN0IFNTMiA9ICdcXHg4ZSc7XG4gIC8qKiBTaW5nbGUtU2hpZnQgMyAqL1xuICBleHBvcnQgY29uc3QgU1MzID0gJ1xceDhmJztcbiAgLyoqIERldmljZSBDb250cm9sIFN0cmluZyAqL1xuICBleHBvcnQgY29uc3QgRENTID0gJ1xceDkwJztcbiAgLyoqIFByaXZhdGUgVXNlIDEgKi9cbiAgZXhwb3J0IGNvbnN0IFBVMSA9ICdcXHg5MSc7XG4gIC8qKiBQcml2YXRlIFVzZSAyICovXG4gIGV4cG9ydCBjb25zdCBQVTIgPSAnXFx4OTInO1xuICAvKiogU2V0IFRyYW5zbWl0IFN0YXRlICovXG4gIGV4cG9ydCBjb25zdCBTVFMgPSAnXFx4OTMnO1xuICAvKiogRGVzdHJ1Y3RpdmUgYmFja3NwYWNlLCBpbnRlbmRlZCB0byBlbGltaW5hdGUgYW1iaWd1aXR5IGFib3V0IG1lYW5pbmcgb2YgQlMuICovXG4gIGV4cG9ydCBjb25zdCBDQ0ggPSAnXFx4OTQnO1xuICAvKiogTWVzc2FnZSBXYWl0aW5nICovXG4gIGV4cG9ydCBjb25zdCBNVyA9ICdcXHg5NSc7XG4gIC8qKiBTdGFydCBvZiBQcm90ZWN0ZWQgQXJlYSAqL1xuICBleHBvcnQgY29uc3QgU1BBID0gJ1xceDk2JztcbiAgLyoqIEVuZCBvZiBQcm90ZWN0ZWQgQXJlYSAqL1xuICBleHBvcnQgY29uc3QgRVBBID0gJ1xceDk3JztcbiAgLyoqIFN0YXJ0IG9mIFN0cmluZyAqL1xuICBleHBvcnQgY29uc3QgU09TID0gJ1xceDk4JztcbiAgLyoqIFNpbmdsZSBHcmFwaGljIENoYXJhY3RlciBJbnRyb2R1Y2VyICovXG4gIGV4cG9ydCBjb25zdCBTR0NJID0gJ1xceDk5JztcbiAgLyoqIFNpbmdsZSBDaGFyYWN0ZXIgSW50cm9kdWNlciAqL1xuICBleHBvcnQgY29uc3QgU0NJID0gJ1xceDlhJztcbiAgLyoqIENvbnRyb2wgU2VxdWVuY2UgSW50cm9kdWNlciAqL1xuICBleHBvcnQgY29uc3QgQ1NJID0gJ1xceDliJztcbiAgLyoqIFN0cmluZyBUZXJtaW5hdG9yICovXG4gIGV4cG9ydCBjb25zdCBTVCA9ICdcXHg5Yyc7XG4gIC8qKiBPcGVyYXRpbmcgU3lzdGVtIENvbW1hbmQgKi9cbiAgZXhwb3J0IGNvbnN0IE9TQyA9ICdcXHg5ZCc7XG4gIC8qKiBQcml2YWN5IE1lc3NhZ2UgKi9cbiAgZXhwb3J0IGNvbnN0IFBNID0gJ1xceDllJztcbiAgLyoqIEFwcGxpY2F0aW9uIFByb2dyYW0gQ29tbWFuZCAqL1xuICBleHBvcnQgY29uc3QgQVBDID0gJ1xceDlmJztcbn1cbmV4cG9ydCBuYW1lc3BhY2UgQzFfRVNDQVBFRCB7XG4gIGV4cG9ydCBjb25zdCBTVCA9IGAke0MwLkVTQ31cXFxcYDtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIENocmlzdG9waGVyIEplZmZyZXkgKE1JVCBMaWNlbnNlKVxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUtleWJvYXJkRXZlbnQsIElLZXlib2FyZFJlc3VsdCwgS2V5Ym9hcmRSZXN1bHRUeXBlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEMwIH0gZnJvbSAnY29tbW9uL2RhdGEvRXNjYXBlU2VxdWVuY2VzJztcblxuLy8gcmVnICsgc2hpZnQga2V5IG1hcHBpbmdzIGZvciBkaWdpdHMgYW5kIHNwZWNpYWwgY2hhcnNcbmNvbnN0IEtFWUNPREVfS0VZX01BUFBJTkdTOiB7IFtrZXk6IG51bWJlcl06IFtzdHJpbmcsIHN0cmluZ119ID0ge1xuICAvLyBkaWdpdHMgMC05XG4gIDQ4OiBbJzAnLCAnKSddLFxuICA0OTogWycxJywgJyEnXSxcbiAgNTA6IFsnMicsICdAJ10sXG4gIDUxOiBbJzMnLCAnIyddLFxuICA1MjogWyc0JywgJyQnXSxcbiAgNTM6IFsnNScsICclJ10sXG4gIDU0OiBbJzYnLCAnXiddLFxuICA1NTogWyc3JywgJyYnXSxcbiAgNTY6IFsnOCcsICcqJ10sXG4gIDU3OiBbJzknLCAnKCddLFxuXG4gIC8vIHNwZWNpYWwgY2hhcnNcbiAgMTg2OiBbJzsnLCAnOiddLFxuICAxODc6IFsnPScsICcrJ10sXG4gIDE4ODogWycsJywgJzwnXSxcbiAgMTg5OiBbJy0nLCAnXyddLFxuICAxOTA6IFsnLicsICc+J10sXG4gIDE5MTogWycvJywgJz8nXSxcbiAgMTkyOiBbJ2AnLCAnfiddLFxuICAyMTk6IFsnWycsICd7J10sXG4gIDIyMDogWydcXFxcJywgJ3wnXSxcbiAgMjIxOiBbJ10nLCAnfSddLFxuICAyMjI6IFsnXFwnJywgJ1wiJ11cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUtleWJvYXJkRXZlbnQoXG4gIGV2OiBJS2V5Ym9hcmRFdmVudCxcbiAgYXBwbGljYXRpb25DdXJzb3JNb2RlOiBib29sZWFuLFxuICBpc01hYzogYm9vbGVhbixcbiAgbWFjT3B0aW9uSXNNZXRhOiBib29sZWFuXG4pOiBJS2V5Ym9hcmRSZXN1bHQge1xuICBjb25zdCByZXN1bHQ6IElLZXlib2FyZFJlc3VsdCA9IHtcbiAgICB0eXBlOiBLZXlib2FyZFJlc3VsdFR5cGUuU0VORF9LRVksXG4gICAgLy8gV2hldGhlciB0byBjYW5jZWwgZXZlbnQgcHJvcGFnYXRpb24gKE5PVEU6IHRoaXMgbWF5IG5vdCBiZSBuZWVkZWQgc2luY2UgdGhlIGV2ZW50IGlzXG4gICAgLy8gY2FuY2VsZWQgYXQgdGhlIGVuZCBvZiBrZXlEb3duXG4gICAgY2FuY2VsOiBmYWxzZSxcbiAgICAvLyBUaGUgbmV3IGtleSBldmVuIHRvIGVtaXRcbiAgICBrZXk6IHVuZGVmaW5lZFxuICB9O1xuICBjb25zdCBtb2RpZmllcnMgPSAoZXYuc2hpZnRLZXkgPyAxIDogMCkgfCAoZXYuYWx0S2V5ID8gMiA6IDApIHwgKGV2LmN0cmxLZXkgPyA0IDogMCkgfCAoZXYubWV0YUtleSA/IDggOiAwKTtcbiAgc3dpdGNoIChldi5rZXlDb2RlKSB7XG4gICAgY2FzZSAwOlxuICAgICAgaWYgKGV2LmtleSA9PT0gJ1VJS2V5SW5wdXRVcEFycm93Jykge1xuICAgICAgICBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPQSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbQSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGV2LmtleSA9PT0gJ1VJS2V5SW5wdXRMZWZ0QXJyb3cnKSB7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09EJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tEJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZXYua2V5ID09PSAnVUlLZXlJbnB1dFJpZ2h0QXJyb3cnKSB7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09DJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tDJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZXYua2V5ID09PSAnVUlLZXlJbnB1dERvd25BcnJvdycpIHtcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0InO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0InO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICAvLyBiYWNrc3BhY2VcbiAgICAgIHJlc3VsdC5rZXkgPSBldi5jdHJsS2V5ID8gJ1xcYicgOiBDMC5ERUw7IC8vIF5IIG9yIF4/XG4gICAgICBpZiAoZXYuYWx0S2V5KSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyByZXN1bHQua2V5O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA5OlxuICAgICAgLy8gdGFiXG4gICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbWic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmtleSA9IEMwLkhUO1xuICAgICAgcmVzdWx0LmNhbmNlbCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDEzOlxuICAgICAgLy8gcmV0dXJuL2VudGVyXG4gICAgICByZXN1bHQua2V5ID0gZXYuYWx0S2V5ID8gQzAuRVNDICsgQzAuQ1IgOiBDMC5DUjtcbiAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAyNzpcbiAgICAgIC8vIGVzY2FwZVxuICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQztcbiAgICAgIGlmIChldi5hbHRLZXkpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIEMwLkVTQztcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzNzpcbiAgICAgIC8vIGxlZnQtYXJyb3dcbiAgICAgIGlmIChldi5tZXRhS2V5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnRCc7XG4gICAgICAgIC8vIEhBQ0s6IE1ha2UgQWx0ICsgbGVmdC1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgbGVmdC1hcnJvdzogbW92ZSBvbmUgd29yZCBiYWNrd2FyZHNcbiAgICAgICAgLy8gaHR0cDovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vYS8xMDgxMDZcbiAgICAgICAgLy8gbWFjT1MgdXNlcyBkaWZmZXJlbnQgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIGxpbnV4XG4gICAgICAgIGlmIChyZXN1bHQua2V5ID09PSBDMC5FU0MgKyAnWzE7M0QnKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIChpc01hYyA/ICdiJyA6ICdbMTs1RCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09EJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0QnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOTpcbiAgICAgIC8vIHJpZ2h0LWFycm93XG4gICAgICBpZiAoZXYubWV0YUtleSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0MnO1xuICAgICAgICAvLyBIQUNLOiBNYWtlIEFsdCArIHJpZ2h0LWFycm93IGJlaGF2ZSBsaWtlIEN0cmwgKyByaWdodC1hcnJvdzogbW92ZSBvbmUgd29yZCBmb3J3YXJkXG4gICAgICAgIC8vIGh0dHA6Ly91bml4LnN0YWNrZXhjaGFuZ2UuY29tL2EvMTA4MTA2XG4gICAgICAgIC8vIG1hY09TIHVzZXMgZGlmZmVyZW50IGVzY2FwZSBzZXF1ZW5jZXMgdGhhbiBsaW51eFxuICAgICAgICBpZiAocmVzdWx0LmtleSA9PT0gQzAuRVNDICsgJ1sxOzNDJykge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAoaXNNYWMgPyAnZicgOiAnWzE7NUMnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPQyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tDJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzg6XG4gICAgICAvLyB1cC1hcnJvd1xuICAgICAgaWYgKGV2Lm1ldGFLZXkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdBJztcbiAgICAgICAgLy8gSEFDSzogTWFrZSBBbHQgKyB1cC1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgdXAtYXJyb3dcbiAgICAgICAgLy8gaHR0cDovL3VuaXguc3RhY2tleGNoYW5nZS5jb20vYS8xMDgxMDZcbiAgICAgICAgLy8gbWFjT1MgdXNlcyBkaWZmZXJlbnQgZXNjYXBlIHNlcXVlbmNlcyB0aGFuIGxpbnV4XG4gICAgICAgIGlmICghaXNNYWMgJiYgcmVzdWx0LmtleSA9PT0gQzAuRVNDICsgJ1sxOzNBJykge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7NUEnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFwcGxpY2F0aW9uQ3Vyc29yTW9kZSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ09BJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnW0EnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0MDpcbiAgICAgIC8vIGRvd24tYXJyb3dcbiAgICAgIGlmIChldi5tZXRhS2V5KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnQic7XG4gICAgICAgIC8vIEhBQ0s6IE1ha2UgQWx0ICsgZG93bi1hcnJvdyBiZWhhdmUgbGlrZSBDdHJsICsgZG93bi1hcnJvd1xuICAgICAgICAvLyBodHRwOi8vdW5peC5zdGFja2V4Y2hhbmdlLmNvbS9hLzEwODEwNlxuICAgICAgICAvLyBtYWNPUyB1c2VzIGRpZmZlcmVudCBlc2NhcGUgc2VxdWVuY2VzIHRoYW4gbGludXhcbiAgICAgICAgaWYgKCFpc01hYyAmJiByZXN1bHQua2V5ID09PSBDMC5FU0MgKyAnWzE7M0InKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTs1Qic7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXBwbGljYXRpb25DdXJzb3JNb2RlKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT0InO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbQic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDQ1OlxuICAgICAgLy8gaW5zZXJ0XG4gICAgICBpZiAoIWV2LnNoaWZ0S2V5ICYmICFldi5jdHJsS2V5KSB7XG4gICAgICAgIC8vIDxDdHJsPiBvciA8U2hpZnQ+ICsgPEluc2VydD4gYXJlIHVzZWQgdG9cbiAgICAgICAgLy8gY29weS1wYXN0ZSBvbiBzb21lIHN5c3RlbXMuXG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzJ+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgNDY6XG4gICAgICAvLyBkZWxldGVcbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbM34nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzNjpcbiAgICAgIC8vIGhvbWVcbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0gnO1xuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPSCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tIJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzU6XG4gICAgICAvLyBlbmRcbiAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0YnO1xuICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkN1cnNvck1vZGUpIHtcbiAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArICdPRic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1tGJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMzM6XG4gICAgICAvLyBwYWdlIHVwXG4gICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgcmVzdWx0LnR5cGUgPSBLZXlib2FyZFJlc3VsdFR5cGUuUEFHRV9VUDtcbiAgICAgIH0gZWxzZSBpZiAoZXYuY3RybEtleSkge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1s1OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1s1fic7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM0OlxuICAgICAgLy8gcGFnZSBkb3duXG4gICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgcmVzdWx0LnR5cGUgPSBLZXlib2FyZFJlc3VsdFR5cGUuUEFHRV9ET1dOO1xuICAgICAgfSBlbHNlIGlmIChldi5jdHJsS2V5KSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzY7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzZ+JztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTEyOlxuICAgICAgLy8gRjEtRjEyXG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdQJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1AnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTM6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdRJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1EnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTQ6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdSJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1InO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTU6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdTJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnT1MnO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTY6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE1OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxNX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTc6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE3OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxN34nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTg6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE4OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOH4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMTk6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzE5OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1sxOX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjA6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzIwOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMH4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjE6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzIxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syMX4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjI6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzIzOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syM34nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxMjM6XG4gICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgIHJlc3VsdC5rZXkgPSBDMC5FU0MgKyAnWzI0OycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsgJ1syNH4nO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGEteiBhbmQgc3BhY2VcbiAgICAgIGlmIChldi5jdHJsS2V5ICYmICFldi5zaGlmdEtleSAmJiAhZXYuYWx0S2V5ICYmICFldi5tZXRhS2V5KSB7XG4gICAgICAgIGlmIChldi5rZXlDb2RlID49IDY1ICYmIGV2LmtleUNvZGUgPD0gOTApIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldi5rZXlDb2RlIC0gNjQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLk5VTDtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID49IDUxICYmIGV2LmtleUNvZGUgPD0gNTUpIHtcbiAgICAgICAgICAvLyBlc2NhcGUsIGZpbGUgc2VwLCBncm91cCBzZXAsIHJlY29yZCBzZXAsIHVuaXQgc2VwXG4gICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXYua2V5Q29kZSAtIDUxICsgMjcpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDU2KSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkRFTDtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMTkpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDIyMCkge1xuICAgICAgICAgIHJlc3VsdC5rZXkgPSBDMC5GUztcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMjEpIHtcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuR1M7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKCFpc01hYyB8fCBtYWNPcHRpb25Jc01ldGEpICYmIGV2LmFsdEtleSAmJiAhZXYubWV0YUtleSkge1xuICAgICAgICAvLyBPbiBtYWNPUyB0aGlzIGlzIGEgdGhpcmQgbGV2ZWwgc2hpZnQgd2hlbiAhbWFjT3B0aW9uSXNNZXRhLiBVc2UgPEVzYz4gaW5zdGVhZC5cbiAgICAgICAgY29uc3Qga2V5TWFwcGluZyA9IEtFWUNPREVfS0VZX01BUFBJTkdTW2V2LmtleUNvZGVdO1xuICAgICAgICBjb25zdCBrZXkgPSBrZXlNYXBwaW5nPy5bIWV2LnNoaWZ0S2V5ID8gMCA6IDFdO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIGtleTtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXlDb2RlID49IDY1ICYmIGV2LmtleUNvZGUgPD0gOTApIHtcbiAgICAgICAgICBjb25zdCBrZXlDb2RlID0gZXYuY3RybEtleSA/IGV2LmtleUNvZGUgLSA2NCA6IGV2LmtleUNvZGUgKyAzMjtcbiAgICAgICAgICBsZXQga2V5U3RyaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXlDb2RlKTtcbiAgICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGtleVN0cmluZyA9IGtleVN0cmluZy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsga2V5U3RyaW5nO1xuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLkVTQyArIChldi5jdHJsS2V5ID8gQzAuTlVMIDogJyAnKTtcbiAgICAgICAgfSBlbHNlIGlmIChldi5rZXkgPT09ICdEZWFkJyAmJiBldi5jb2RlLnN0YXJ0c1dpdGgoJ0tleScpKSB7XG4gICAgICAgICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9pc3N1ZXMvMzcyNVxuICAgICAgICAgIC8vIEFsdCB3aWxsIHByb2R1Y2UgYSBcImRlYWQga2V5XCIgKGluaXRhdGUgY29tcG9zaXRpb24pIHdpdGggc29tZVxuICAgICAgICAgIC8vIG9mIHRoZSBsZXR0ZXJzIGluIFVTIGxheW91dCAoZS5nLiBOL0UvVSkuXG4gICAgICAgICAgLy8gSXQncyBzYWZlIHRvIG1hdGNoIGFnYWluc3QgS2V5KiBzaW5jZSBubyBvdGhlciBgY29kZWAgdmFsdWVzIGJlZ2luIHdpdGggXCJLZXlcIi5cbiAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvS2V5Ym9hcmRFdmVudC9jb2RlL2NvZGVfdmFsdWVzI2NvZGVfdmFsdWVzX29uX21hY1xuICAgICAgICAgIGxldCBrZXlTdHJpbmcgPSBldi5jb2RlLnNsaWNlKDMsIDQpO1xuICAgICAgICAgIGlmICghZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGtleVN0cmluZyA9IGtleVN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuRVNDICsga2V5U3RyaW5nO1xuICAgICAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTWFjICYmICFldi5hbHRLZXkgJiYgIWV2LmN0cmxLZXkgJiYgIWV2LnNoaWZ0S2V5ICYmIGV2Lm1ldGFLZXkpIHtcbiAgICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDY1KSB7IC8vIGNtZCArIGFcbiAgICAgICAgICByZXN1bHQudHlwZSA9IEtleWJvYXJkUmVzdWx0VHlwZS5TRUxFQ1RfQUxMO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGV2LmtleSAmJiAhZXYuY3RybEtleSAmJiAhZXYuYWx0S2V5ICYmICFldi5tZXRhS2V5ICYmIGV2LmtleUNvZGUgPj0gNDggJiYgZXYua2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBJbmNsdWRlIG9ubHkga2V5cyB0aGF0IHRoYXQgcmVzdWx0IGluIGEgX3NpbmdsZV8gY2hhcmFjdGVyOyBkb24ndCBpbmNsdWRlIG51bSBsb2NrLFxuICAgICAgICAvLyB2b2x1bWUgdXAsIGV0Yy5cbiAgICAgICAgcmVzdWx0LmtleSA9IGV2LmtleTtcbiAgICAgIH0gZWxzZSBpZiAoZXYua2V5ICYmIGV2LmN0cmxLZXkpIHtcbiAgICAgICAgaWYgKGV2LmtleSA9PT0gJ18nKSB7IC8vIF5fXG4gICAgICAgICAgcmVzdWx0LmtleSA9IEMwLlVTO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldi5rZXkgPT09ICdAJykgeyAvLyBeICsgc2hpZnQgKyAyID0gXiArIEBcbiAgICAgICAgICByZXN1bHQua2V5ID0gQzAuTlVMO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qKlxuICogUG9seWZpbGwgLSBDb252ZXJ0IFVURjMyIGNvZGVwb2ludCBpbnRvIEpTIHN0cmluZy5cbiAqIE5vdGU6IFRoZSBidWlsdC1pbiBTdHJpbmcuZnJvbUNvZGVQb2ludCBoYXBwZW5zIHRvIGJlIG11Y2ggc2xvd2VyXG4gKiAgICAgICBkdWUgdG8gYWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzLiBXZSBjYW4gYXZvaWQgdGhlbSBzaW5jZVxuICogICAgICAgd2UgYWx3YXlzIG9wZXJhdGUgb24gbGVnYWwgVVRGMzIgKGdyYW50ZWQgYnkgdGhlIGlucHV0IGRlY29kZXJzKVxuICogICAgICAgYW5kIHVzZSB0aGlzIGZhc3RlciB2ZXJzaW9uIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdGcm9tQ29kZVBvaW50KGNvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgPj4gMTApICsgMHhEODAwKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoKGNvZGVQb2ludCAlIDB4NDAwKSArIDB4REMwMCk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFVURjMyIGNoYXIgY29kZXMgaW50byBKUyBzdHJpbmcuXG4gKiBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgYHN0cmluZ0Zyb21Db2RlUG9pbnRgIGJ1dCBmb3IgbXVsdGlwbGUgY29kZXBvaW50c1xuICogaW4gYSBsb29wICh3aGljaCBpcyBhIGxvdCBmYXN0ZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXRmMzJUb1N0cmluZyhkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciA9IDAsIGVuZDogbnVtYmVyID0gZGF0YS5sZW5ndGgpOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgbGV0IGNvZGVwb2ludCA9IGRhdGFbaV07XG4gICAgaWYgKGNvZGVwb2ludCA+IDB4RkZGRikge1xuICAgICAgLy8gSlMgc3RyaW5ncyBhcmUgZW5jb2RlZCBhcyBVVEYxNiwgdGh1cyBhIG5vbiBCTVAgY29kZXBvaW50IGdldHMgY29udmVydGVkIGludG8gYSBzdXJyb2dhdGVcbiAgICAgIC8vIHBhaXIgY29udmVyc2lvbiBydWxlczpcbiAgICAgIC8vICAtIHN1YnRyYWN0IDB4MTAwMDAgZnJvbSBjb2RlIHBvaW50LCBsZWF2aW5nIGEgMjAgYml0IG51bWJlclxuICAgICAgLy8gIC0gYWRkIGhpZ2ggMTAgYml0cyB0byAweEQ4MDAgIC0tPiBmaXJzdCBzdXJyb2dhdGVcbiAgICAgIC8vICAtIGFkZCBsb3cgMTAgYml0cyB0byAweERDMDAgICAtLT4gc2Vjb25kIHN1cnJvZ2F0ZVxuICAgICAgY29kZXBvaW50IC09IDB4MTAwMDA7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoY29kZXBvaW50ID4+IDEwKSArIDB4RDgwMCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKChjb2RlcG9pbnQgJSAweDQwMCkgKyAweERDMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlcG9pbnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFN0cmluZ1RvVXRmMzIgLSBkZWNvZGVzIFVURjE2IHNlcXVlbmNlcyBpbnRvIFVURjMyIGNvZGVwb2ludHMuXG4gKiBUbyBrZWVwIHRoZSBkZWNvZGVyIGluIGxpbmUgd2l0aCBKUyBzdHJpbmdzIGl0IGhhbmRsZXMgc2luZ2xlIHN1cnJvZ2F0ZXMgYXMgVUNTMi5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmluZ1RvVXRmMzIge1xuICBwcml2YXRlIF9pbnRlcmltOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBDbGVhcnMgaW50ZXJpbSBhbmQgcmVzZXRzIGRlY29kZXIgdG8gY2xlYW4gc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5faW50ZXJpbSA9IDA7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIEpTIHN0cmluZyB0byBVVEYzMiBjb2RlcG9pbnRzLlxuICAgKiBUaGUgbWV0aG9kcyBhc3N1bWVzIHN0cmVhbSBpbnB1dCBhbmQgd2lsbCBzdG9yZSBwYXJ0bHkgdHJhbnNtaXR0ZWRcbiAgICogc3Vycm9nYXRlIHBhaXJzIGFuZCBkZWNvZGUgdGhlbSB3aXRoIHRoZSBuZXh0IGRhdGEgY2h1bmsuXG4gICAqIE5vdGU6IFRoZSBtZXRob2QgZG9lcyBubyBib3VuZCBjaGVja3MgZm9yIHRhcmdldCwgdGhlcmVmb3JlIG1ha2Ugc3VyZVxuICAgKiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YSBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYHRhcmdldGAuXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGNvZGVwb2ludHMgaW4gYHRhcmdldGAuXG4gICAqL1xuICBwdWJsaWMgZGVjb2RlKGlucHV0OiBzdHJpbmcsIHRhcmdldDogVWludDMyQXJyYXkpOiBudW1iZXIge1xuICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IHN0YXJ0UG9zID0gMDtcblxuICAgIC8vIGhhbmRsZSBsZWZ0b3ZlciBzdXJyb2dhdGUgaGlnaFxuICAgIGlmICh0aGlzLl9pbnRlcmltKSB7XG4gICAgICBjb25zdCBzZWNvbmQgPSBpbnB1dC5jaGFyQ29kZUF0KHN0YXJ0UG9zKyspO1xuICAgICAgaWYgKDB4REMwMCA8PSBzZWNvbmQgJiYgc2Vjb25kIDw9IDB4REZGRikge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9ICh0aGlzLl9pbnRlcmltIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IChVU0MyIGhhbmRsaW5nKVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IHRoaXMuX2ludGVyaW07XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gc2Vjb25kO1xuICAgICAgfVxuICAgICAgdGhpcy5faW50ZXJpbSA9IDA7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0UG9zOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBpbnB1dC5jaGFyQ29kZUF0KGkpO1xuICAgICAgLy8gc3Vycm9nYXRlIHBhaXIgZmlyc3RcbiAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICBpZiAoKytpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2ludGVyaW0gPSBjb2RlO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlY29uZCA9IGlucHV0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IChjb2RlIC0gMHhEODAwKSAqIDB4NDAwICsgc2Vjb25kIC0gMHhEQzAwICsgMHgxMDAwMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludCAoVVNDMiBoYW5kbGluZylcbiAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGU7XG4gICAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBzZWNvbmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY29kZSA9PT0gMHhGRUZGKSB7XG4gICAgICAgIC8vIEJPTVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRhcmdldFtzaXplKytdID0gY29kZTtcbiAgICB9XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbn1cblxuLyoqXG4gKiBVdGY4RGVjb2RlciAtIGRlY29kZXMgVVRGOCBieXRlIHNlcXVlbmNlcyBpbnRvIFVURjMyIGNvZGVwb2ludHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBVdGY4VG9VdGYzMiB7XG4gIHB1YmxpYyBpbnRlcmltOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoMyk7XG5cbiAgLyoqXG4gICAqIENsZWFycyBpbnRlcmltIGJ5dGVzIGFuZCByZXNldHMgZGVjb2RlciB0byBjbGVhbiBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmludGVyaW0uZmlsbCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGVzIFVURjggYnl0ZSBzZXF1ZW5jZXMgaW4gYGlucHV0YCB0byBVVEYzMiBjb2RlcG9pbnRzIGluIGB0YXJnZXRgLlxuICAgKiBUaGUgbWV0aG9kcyBhc3N1bWVzIHN0cmVhbSBpbnB1dCBhbmQgd2lsbCBzdG9yZSBwYXJ0bHkgdHJhbnNtaXR0ZWQgYnl0ZXNcbiAgICogYW5kIGRlY29kZSB0aGVtIHdpdGggdGhlIG5leHQgZGF0YSBjaHVuay5cbiAgICogTm90ZTogVGhlIG1ldGhvZCBkb2VzIG5vIGJvdW5kIGNoZWNrcyBmb3IgdGFyZ2V0LCB0aGVyZWZvcmUgbWFrZSBzdXJlXG4gICAqIHRoZSBwcm92aWRlZCBkYXRhIGNodW5rIGRvZXMgbm90IGV4Y2VlZCB0aGUgc2l6ZSBvZiBgdGFyZ2V0YC5cbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXR0ZW4gY29kZXBvaW50cyBpbiBgdGFyZ2V0YC5cbiAgICovXG4gIHB1YmxpYyBkZWNvZGUoaW5wdXQ6IFVpbnQ4QXJyYXksIHRhcmdldDogVWludDMyQXJyYXkpOiBudW1iZXIge1xuICAgIGNvbnN0IGxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcblxuICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBsZXQgc2l6ZSA9IDA7XG4gICAgbGV0IGJ5dGUxOiBudW1iZXI7XG4gICAgbGV0IGJ5dGUyOiBudW1iZXI7XG4gICAgbGV0IGJ5dGUzOiBudW1iZXI7XG4gICAgbGV0IGJ5dGU0OiBudW1iZXI7XG4gICAgbGV0IGNvZGVwb2ludCA9IDA7XG4gICAgbGV0IHN0YXJ0UG9zID0gMDtcblxuICAgIC8vIGhhbmRsZSBsZWZ0b3ZlciBieXRlc1xuICAgIGlmICh0aGlzLmludGVyaW1bMF0pIHtcbiAgICAgIGxldCBkaXNjYXJkSW50ZXJpbSA9IGZhbHNlO1xuICAgICAgbGV0IGNwID0gdGhpcy5pbnRlcmltWzBdO1xuICAgICAgY3AgJj0gKCgoKGNwICYgMHhFMCkgPT09IDB4QzApKSA/IDB4MUYgOiAoKChjcCAmIDB4RjApID09PSAweEUwKSkgPyAweDBGIDogMHgwNyk7XG4gICAgICBsZXQgcG9zID0gMDtcbiAgICAgIGxldCB0bXA6IG51bWJlcjtcbiAgICAgIHdoaWxlICgodG1wID0gdGhpcy5pbnRlcmltWysrcG9zXSAmIDB4M0YpICYmIHBvcyA8IDQpIHtcbiAgICAgICAgY3AgPDw9IDY7XG4gICAgICAgIGNwIHw9IHRtcDtcbiAgICAgIH1cbiAgICAgIC8vIG1pc3NpbmcgYnl0ZXMgLSByZWFkIGFoZWFkIGZyb20gaW5wdXRcbiAgICAgIGNvbnN0IHR5cGUgPSAoKCh0aGlzLmludGVyaW1bMF0gJiAweEUwKSA9PT0gMHhDMCkpID8gMiA6ICgoKHRoaXMuaW50ZXJpbVswXSAmIDB4RjApID09PSAweEUwKSkgPyAzIDogNDtcbiAgICAgIGNvbnN0IG1pc3NpbmcgPSB0eXBlIC0gcG9zO1xuICAgICAgd2hpbGUgKHN0YXJ0UG9zIDwgbWlzc2luZykge1xuICAgICAgICBpZiAoc3RhcnRQb3MgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdG1wID0gaW5wdXRbc3RhcnRQb3MrK107XG4gICAgICAgIGlmICgodG1wICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb24sIGRpc2NhcmQgaW50ZXJpbSBieXRlcyBjb21wbGV0ZWx5XG4gICAgICAgICAgc3RhcnRQb3MtLTtcbiAgICAgICAgICBkaXNjYXJkSW50ZXJpbSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbmVlZCB0byBzYXZlIHNvIHdlIGNhbiBjb250aW51ZSBzaG9ydCBpbnB1dHMgaW4gbmV4dCBjYWxsXG4gICAgICAgICAgdGhpcy5pbnRlcmltW3BvcysrXSA9IHRtcDtcbiAgICAgICAgICBjcCA8PD0gNjtcbiAgICAgICAgICBjcCB8PSB0bXAgJiAweDNGO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWRpc2NhcmRJbnRlcmltKSB7XG4gICAgICAgIC8vIGZpbmFsIHRlc3QgaXMgdHlwZSBkZXBlbmRlbnRcbiAgICAgICAgaWYgKHR5cGUgPT09IDIpIHtcbiAgICAgICAgICBpZiAoY3AgPCAweDgwKSB7XG4gICAgICAgICAgICAvLyB3cm9uZyBzdGFydGVyIGJ5dGVcbiAgICAgICAgICAgIHN0YXJ0UG9zLS07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtzaXplKytdID0gY3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IDMpIHtcbiAgICAgICAgICBpZiAoY3AgPCAweDA4MDAgfHwgKGNwID49IDB4RDgwMCAmJiBjcCA8PSAweERGRkYpIHx8IGNwID09PSAweEZFRkYpIHtcbiAgICAgICAgICAgIC8vIGlsbGVnYWwgY29kZXBvaW50IG9yIEJPTVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY3AgPCAweDAxMDAwMCB8fCBjcCA+IDB4MTBGRkZGKSB7XG4gICAgICAgICAgICAvLyBpbGxlZ2FsIGNvZGVwb2ludFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5pbnRlcmltLmZpbGwoMCk7XG4gICAgfVxuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGlucHV0XG4gICAgY29uc3QgZm91clN0b3AgPSBsZW5ndGggLSA0O1xuICAgIGxldCBpID0gc3RhcnRQb3M7XG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIC8qKlxuICAgICAgICogQVNDSUkgc2hvcnRjdXQgd2l0aCBsb29wIHVucm9sbGVkIHRvIDQgY29uc2VjdXRpdmUgQVNDSUkgY2hhcnMuXG4gICAgICAgKiBUaGlzIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGdhaW4gZm9yIEFTQ0lJXG4gICAgICAgKiBhbmQgcGVuYWx0eSBmb3Igbm9uIEFTQ0lJOlxuICAgICAgICogRm9yIGJlc3QgQVNDSUkgcGVyZm9ybWFuY2UgdGhlIGNoYXIgc2hvdWxkIGJlIHN0b3JlZCBkaXJlY3RseSBpbnRvIHRhcmdldCxcbiAgICAgICAqIGJ1dCBldmVuIGEgc2luZ2xlIGF0dGVtcHQgdG8gd3JpdGUgdG8gdGFyZ2V0IGFuZCBjb21wYXJlIGFmdGVyd2FyZHNcbiAgICAgICAqIHBlbmFsaXplcyBub24gQVNDSUkgcmVhbGx5IGJhZCAoLTUwJSksIHRodXMgd2UgbG9hZCB0aGUgY2hhciBpbnRvIGJ5dGVYIGZpcnN0LFxuICAgICAgICogd2hpY2ggcmVkdWNlcyBBU0NJSSBwZXJmb3JtYW5jZSBieSB+MTUlLlxuICAgICAgICogVGhpcyB0cmlhbCBmb3IgQVNDSUkgcmVkdWNlcyBub24gQVNDSUkgcGVyZm9ybWFuY2UgYnkgfjEwJSB3aGljaCBzZWVtcyBhY2NlcHRpYmxlXG4gICAgICAgKiBjb21wYXJlZCB0byB0aGUgZ2FpbnMuXG4gICAgICAgKiBOb3RlIHRoYXQgdGhpcyBvcHRpbWl6YXRpb24gb25seSB0YWtlcyBwbGFjZSBmb3IgNCBjb25zZWN1dGl2ZSBBU0NJSSBjaGFycyxcbiAgICAgICAqIGZvciBhbnkgc2hvcnRlciBpdCBiYWlscyBvdXQuIFdvcnN0IGNhc2UgLSBhbGwgNCBieXRlcyBiZWluZyByZWFkIGJ1dFxuICAgICAgICogdGhyb3duIGF3YXkgZHVlIHRvIHRoZSBsYXN0IGJlaW5nIGEgbm9uIEFTQ0lJIGNoYXIgKC0xMCUgcGVyZm9ybWFuY2UpLlxuICAgICAgICovXG4gICAgICB3aGlsZSAoaSA8IGZvdXJTdG9wXG4gICAgICAgICYmICEoKGJ5dGUxID0gaW5wdXRbaV0pICYgMHg4MClcbiAgICAgICAgJiYgISgoYnl0ZTIgPSBpbnB1dFtpICsgMV0pICYgMHg4MClcbiAgICAgICAgJiYgISgoYnl0ZTMgPSBpbnB1dFtpICsgMl0pICYgMHg4MClcbiAgICAgICAgJiYgISgoYnl0ZTQgPSBpbnB1dFtpICsgM10pICYgMHg4MCkpXG4gICAgICB7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTE7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTI7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTM7XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gYnl0ZTQ7XG4gICAgICAgIGkgKz0gNDtcbiAgICAgIH1cblxuICAgICAgLy8gcmVyZWFkIGJ5dGUxXG4gICAgICBieXRlMSA9IGlucHV0W2krK107XG5cbiAgICAgIC8vIDEgYnl0ZVxuICAgICAgaWYgKGJ5dGUxIDwgMHg4MCkge1xuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGJ5dGUxO1xuXG4gICAgICAgIC8vIDIgYnl0ZXNcbiAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhFMCkgPT09IDB4QzApIHtcbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTIgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUyICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50ID0gKGJ5dGUxICYgMHgxRikgPDwgNiB8IChieXRlMiAmIDB4M0YpO1xuICAgICAgICBpZiAoY29kZXBvaW50IDwgMHg4MCkge1xuICAgICAgICAgIC8vIHdyb25nIHN0YXJ0ZXIgYnl0ZVxuICAgICAgICAgIGktLTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRbc2l6ZSsrXSA9IGNvZGVwb2ludDtcblxuICAgICAgICAvLyAzIGJ5dGVzXG4gICAgICB9IGVsc2UgaWYgKChieXRlMSAmIDB4RjApID09PSAweEUwKSB7XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUyID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMiAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpID49IGxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVswXSA9IGJ5dGUxO1xuICAgICAgICAgIHRoaXMuaW50ZXJpbVsxXSA9IGJ5dGUyO1xuICAgICAgICAgIHJldHVybiBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGJ5dGUzID0gaW5wdXRbaSsrXTtcbiAgICAgICAgaWYgKChieXRlMyAmIDB4QzApICE9PSAweDgwKSB7XG4gICAgICAgICAgLy8gd3JvbmcgY29udGludWF0aW9uXG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVwb2ludCA9IChieXRlMSAmIDB4MEYpIDw8IDEyIHwgKGJ5dGUyICYgMHgzRikgPDwgNiB8IChieXRlMyAmIDB4M0YpO1xuICAgICAgICBpZiAoY29kZXBvaW50IDwgMHgwODAwIHx8IChjb2RlcG9pbnQgPj0gMHhEODAwICYmIGNvZGVwb2ludCA8PSAweERGRkYpIHx8IGNvZGVwb2ludCA9PT0gMHhGRUZGKSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQgb3IgQk9NLCBubyBpLS0gaGVyZVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtzaXplKytdID0gY29kZXBvaW50O1xuXG4gICAgICAgIC8vIDQgYnl0ZXNcbiAgICAgIH0gZWxzZSBpZiAoKGJ5dGUxICYgMHhGOCkgPT09IDB4RjApIHtcbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTIgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUyICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzFdID0gYnl0ZTI7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTMgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGUzICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzBdID0gYnl0ZTE7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzFdID0gYnl0ZTI7XG4gICAgICAgICAgdGhpcy5pbnRlcmltWzJdID0gYnl0ZTM7XG4gICAgICAgICAgcmV0dXJuIHNpemU7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZTQgPSBpbnB1dFtpKytdO1xuICAgICAgICBpZiAoKGJ5dGU0ICYgMHhDMCkgIT09IDB4ODApIHtcbiAgICAgICAgICAvLyB3cm9uZyBjb250aW51YXRpb25cbiAgICAgICAgICBpLS07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29kZXBvaW50ID0gKGJ5dGUxICYgMHgwNykgPDwgMTggfCAoYnl0ZTIgJiAweDNGKSA8PCAxMiB8IChieXRlMyAmIDB4M0YpIDw8IDYgfCAoYnl0ZTQgJiAweDNGKTtcbiAgICAgICAgaWYgKGNvZGVwb2ludCA8IDB4MDEwMDAwIHx8IGNvZGVwb2ludCA+IDB4MTBGRkZGKSB7XG4gICAgICAgICAgLy8gaWxsZWdhbCBjb2RlcG9pbnQsIG5vIGktLSBoZXJlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3NpemUrK10gPSBjb2RlcG9pbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpbGxlZ2FsIGJ5dGUsIGp1c3Qgc2tpcFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2l6ZTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIsIFVuaWNvZGVDaGFyUHJvcGVydGllcywgVW5pY29kZUNoYXJXaWR0aCB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBVbmljb2RlU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9Vbmljb2RlU2VydmljZSc7XG5cbmNvbnN0IEJNUF9DT01CSU5JTkcgPSBbXG4gIFsweDAzMDAsIDB4MDM2Rl0sIFsweDA0ODMsIDB4MDQ4Nl0sIFsweDA0ODgsIDB4MDQ4OV0sXG4gIFsweDA1OTEsIDB4MDVCRF0sIFsweDA1QkYsIDB4MDVCRl0sIFsweDA1QzEsIDB4MDVDMl0sXG4gIFsweDA1QzQsIDB4MDVDNV0sIFsweDA1QzcsIDB4MDVDN10sIFsweDA2MDAsIDB4MDYwM10sXG4gIFsweDA2MTAsIDB4MDYxNV0sIFsweDA2NEIsIDB4MDY1RV0sIFsweDA2NzAsIDB4MDY3MF0sXG4gIFsweDA2RDYsIDB4MDZFNF0sIFsweDA2RTcsIDB4MDZFOF0sIFsweDA2RUEsIDB4MDZFRF0sXG4gIFsweDA3MEYsIDB4MDcwRl0sIFsweDA3MTEsIDB4MDcxMV0sIFsweDA3MzAsIDB4MDc0QV0sXG4gIFsweDA3QTYsIDB4MDdCMF0sIFsweDA3RUIsIDB4MDdGM10sIFsweDA5MDEsIDB4MDkwMl0sXG4gIFsweDA5M0MsIDB4MDkzQ10sIFsweDA5NDEsIDB4MDk0OF0sIFsweDA5NEQsIDB4MDk0RF0sXG4gIFsweDA5NTEsIDB4MDk1NF0sIFsweDA5NjIsIDB4MDk2M10sIFsweDA5ODEsIDB4MDk4MV0sXG4gIFsweDA5QkMsIDB4MDlCQ10sIFsweDA5QzEsIDB4MDlDNF0sIFsweDA5Q0QsIDB4MDlDRF0sXG4gIFsweDA5RTIsIDB4MDlFM10sIFsweDBBMDEsIDB4MEEwMl0sIFsweDBBM0MsIDB4MEEzQ10sXG4gIFsweDBBNDEsIDB4MEE0Ml0sIFsweDBBNDcsIDB4MEE0OF0sIFsweDBBNEIsIDB4MEE0RF0sXG4gIFsweDBBNzAsIDB4MEE3MV0sIFsweDBBODEsIDB4MEE4Ml0sIFsweDBBQkMsIDB4MEFCQ10sXG4gIFsweDBBQzEsIDB4MEFDNV0sIFsweDBBQzcsIDB4MEFDOF0sIFsweDBBQ0QsIDB4MEFDRF0sXG4gIFsweDBBRTIsIDB4MEFFM10sIFsweDBCMDEsIDB4MEIwMV0sIFsweDBCM0MsIDB4MEIzQ10sXG4gIFsweDBCM0YsIDB4MEIzRl0sIFsweDBCNDEsIDB4MEI0M10sIFsweDBCNEQsIDB4MEI0RF0sXG4gIFsweDBCNTYsIDB4MEI1Nl0sIFsweDBCODIsIDB4MEI4Ml0sIFsweDBCQzAsIDB4MEJDMF0sXG4gIFsweDBCQ0QsIDB4MEJDRF0sIFsweDBDM0UsIDB4MEM0MF0sIFsweDBDNDYsIDB4MEM0OF0sXG4gIFsweDBDNEEsIDB4MEM0RF0sIFsweDBDNTUsIDB4MEM1Nl0sIFsweDBDQkMsIDB4MENCQ10sXG4gIFsweDBDQkYsIDB4MENCRl0sIFsweDBDQzYsIDB4MENDNl0sIFsweDBDQ0MsIDB4MENDRF0sXG4gIFsweDBDRTIsIDB4MENFM10sIFsweDBENDEsIDB4MEQ0M10sIFsweDBENEQsIDB4MEQ0RF0sXG4gIFsweDBEQ0EsIDB4MERDQV0sIFsweDBERDIsIDB4MERENF0sIFsweDBERDYsIDB4MERENl0sXG4gIFsweDBFMzEsIDB4MEUzMV0sIFsweDBFMzQsIDB4MEUzQV0sIFsweDBFNDcsIDB4MEU0RV0sXG4gIFsweDBFQjEsIDB4MEVCMV0sIFsweDBFQjQsIDB4MEVCOV0sIFsweDBFQkIsIDB4MEVCQ10sXG4gIFsweDBFQzgsIDB4MEVDRF0sIFsweDBGMTgsIDB4MEYxOV0sIFsweDBGMzUsIDB4MEYzNV0sXG4gIFsweDBGMzcsIDB4MEYzN10sIFsweDBGMzksIDB4MEYzOV0sIFsweDBGNzEsIDB4MEY3RV0sXG4gIFsweDBGODAsIDB4MEY4NF0sIFsweDBGODYsIDB4MEY4N10sIFsweDBGOTAsIDB4MEY5N10sXG4gIFsweDBGOTksIDB4MEZCQ10sIFsweDBGQzYsIDB4MEZDNl0sIFsweDEwMkQsIDB4MTAzMF0sXG4gIFsweDEwMzIsIDB4MTAzMl0sIFsweDEwMzYsIDB4MTAzN10sIFsweDEwMzksIDB4MTAzOV0sXG4gIFsweDEwNTgsIDB4MTA1OV0sIFsweDExNjAsIDB4MTFGRl0sIFsweDEzNUYsIDB4MTM1Rl0sXG4gIFsweDE3MTIsIDB4MTcxNF0sIFsweDE3MzIsIDB4MTczNF0sIFsweDE3NTIsIDB4MTc1M10sXG4gIFsweDE3NzIsIDB4MTc3M10sIFsweDE3QjQsIDB4MTdCNV0sIFsweDE3QjcsIDB4MTdCRF0sXG4gIFsweDE3QzYsIDB4MTdDNl0sIFsweDE3QzksIDB4MTdEM10sIFsweDE3REQsIDB4MTdERF0sXG4gIFsweDE4MEIsIDB4MTgwRF0sIFsweDE4QTksIDB4MThBOV0sIFsweDE5MjAsIDB4MTkyMl0sXG4gIFsweDE5MjcsIDB4MTkyOF0sIFsweDE5MzIsIDB4MTkzMl0sIFsweDE5MzksIDB4MTkzQl0sXG4gIFsweDFBMTcsIDB4MUExOF0sIFsweDFCMDAsIDB4MUIwM10sIFsweDFCMzQsIDB4MUIzNF0sXG4gIFsweDFCMzYsIDB4MUIzQV0sIFsweDFCM0MsIDB4MUIzQ10sIFsweDFCNDIsIDB4MUI0Ml0sXG4gIFsweDFCNkIsIDB4MUI3M10sIFsweDFEQzAsIDB4MURDQV0sIFsweDFERkUsIDB4MURGRl0sXG4gIFsweDIwMEIsIDB4MjAwRl0sIFsweDIwMkEsIDB4MjAyRV0sIFsweDIwNjAsIDB4MjA2M10sXG4gIFsweDIwNkEsIDB4MjA2Rl0sIFsweDIwRDAsIDB4MjBFRl0sIFsweDMwMkEsIDB4MzAyRl0sXG4gIFsweDMwOTksIDB4MzA5QV0sIFsweEE4MDYsIDB4QTgwNl0sIFsweEE4MEIsIDB4QTgwQl0sXG4gIFsweEE4MjUsIDB4QTgyNl0sIFsweEZCMUUsIDB4RkIxRV0sIFsweEZFMDAsIDB4RkUwRl0sXG4gIFsweEZFMjAsIDB4RkUyM10sIFsweEZFRkYsIDB4RkVGRl0sIFsweEZGRjksIDB4RkZGQl1cbl07XG5jb25zdCBISUdIX0NPTUJJTklORyA9IFtcbiAgWzB4MTBBMDEsIDB4MTBBMDNdLCBbMHgxMEEwNSwgMHgxMEEwNl0sIFsweDEwQTBDLCAweDEwQTBGXSxcbiAgWzB4MTBBMzgsIDB4MTBBM0FdLCBbMHgxMEEzRiwgMHgxMEEzRl0sIFsweDFEMTY3LCAweDFEMTY5XSxcbiAgWzB4MUQxNzMsIDB4MUQxODJdLCBbMHgxRDE4NSwgMHgxRDE4Ql0sIFsweDFEMUFBLCAweDFEMUFEXSxcbiAgWzB4MUQyNDIsIDB4MUQyNDRdLCBbMHhFMDAwMSwgMHhFMDAwMV0sIFsweEUwMDIwLCAweEUwMDdGXSxcbiAgWzB4RTAxMDAsIDB4RTAxRUZdXG5dO1xuXG4vLyBCTVAgbG9va3VwIHRhYmxlLCBsYXp5IGluaXRpYWxpemVkIGR1cmluZyBmaXJzdCBhZGRvbiBsb2FkaW5nXG5sZXQgdGFibGU6IFVpbnQ4QXJyYXk7XG5cbmZ1bmN0aW9uIGJpc2VhcmNoKHVjczogbnVtYmVyLCBkYXRhOiBudW1iZXJbXVtdKTogYm9vbGVhbiB7XG4gIGxldCBtaW4gPSAwO1xuICBsZXQgbWF4ID0gZGF0YS5sZW5ndGggLSAxO1xuICBsZXQgbWlkO1xuICBpZiAodWNzIDwgZGF0YVswXVswXSB8fCB1Y3MgPiBkYXRhW21heF1bMV0pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgd2hpbGUgKG1heCA+PSBtaW4pIHtcbiAgICBtaWQgPSAobWluICsgbWF4KSA+PiAxO1xuICAgIGlmICh1Y3MgPiBkYXRhW21pZF1bMV0pIHtcbiAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgfSBlbHNlIGlmICh1Y3MgPCBkYXRhW21pZF1bMF0pIHtcbiAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBVbmljb2RlVjYgaW1wbGVtZW50cyBJVW5pY29kZVZlcnNpb25Qcm92aWRlciB7XG4gIHB1YmxpYyByZWFkb25seSB2ZXJzaW9uID0gJzYnO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGluaXQgbG9va3VwIHRhYmxlIG9uY2VcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICB0YWJsZSA9IG5ldyBVaW50OEFycmF5KDY1NTM2KTtcbiAgICAgIHRhYmxlLmZpbGwoMSk7XG4gICAgICB0YWJsZVswXSA9IDA7XG4gICAgICAvLyBjb250cm9sIGNoYXJzXG4gICAgICB0YWJsZS5maWxsKDAsIDEsIDMyKTtcbiAgICAgIHRhYmxlLmZpbGwoMCwgMHg3ZiwgMHhhMCk7XG5cbiAgICAgIC8vIGFwcGx5IHdpZGUgY2hhciBydWxlcyBmaXJzdFxuICAgICAgLy8gd2lkZSBjaGFyc1xuICAgICAgdGFibGUuZmlsbCgyLCAweDExMDAsIDB4MTE2MCk7XG4gICAgICB0YWJsZVsweDIzMjldID0gMjtcbiAgICAgIHRhYmxlWzB4MjMyYV0gPSAyO1xuICAgICAgdGFibGUuZmlsbCgyLCAweDJlODAsIDB4YTRkMCk7XG4gICAgICB0YWJsZVsweDMwM2ZdID0gMTsgIC8vIHdyb25nbHkgaW4gbGFzdCBsaW5lXG5cbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhhYzAwLCAweGQ3YTQpO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGY5MDAsIDB4ZmIwMCk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZmUxMCwgMHhmZTFhKTtcbiAgICAgIHRhYmxlLmZpbGwoMiwgMHhmZTMwLCAweGZlNzApO1xuICAgICAgdGFibGUuZmlsbCgyLCAweGZmMDAsIDB4ZmY2MSk7XG4gICAgICB0YWJsZS5maWxsKDIsIDB4ZmZlMCwgMHhmZmU3KTtcblxuICAgICAgLy8gYXBwbHkgY29tYmluaW5nIGxhc3QgdG8gZW5zdXJlIHdlIG92ZXJ3cml0ZVxuICAgICAgLy8gd3JvbmdseSB3aWRlIHNldCBjaGFyczpcbiAgICAgIC8vICAgIHRoZSBvcmlnaW5hbCBhbGdvIGV2YWxzIGNvbWJpbmluZyBmaXJzdCBhbmQgZmFsbHNcbiAgICAgIC8vICAgIHRocm91Z2ggdG8gd2lkZSBjaGVjayBzbyB3ZSBzaW1wbHkgZG8gaGVyZSB0aGUgb3Bwb3NpdGVcbiAgICAgIC8vIGNvbWJpbmluZyAwXG4gICAgICBmb3IgKGxldCByID0gMDsgciA8IEJNUF9DT01CSU5JTkcubGVuZ3RoOyArK3IpIHtcbiAgICAgICAgdGFibGUuZmlsbCgwLCBCTVBfQ09NQklOSU5HW3JdWzBdLCBCTVBfQ09NQklOSU5HW3JdWzFdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHdjd2lkdGgobnVtOiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoIHtcbiAgICBpZiAobnVtIDwgMzIpIHJldHVybiAwO1xuICAgIGlmIChudW0gPCAxMjcpIHJldHVybiAxO1xuICAgIGlmIChudW0gPCA2NTUzNikgcmV0dXJuIHRhYmxlW251bV0gYXMgVW5pY29kZUNoYXJXaWR0aDtcbiAgICBpZiAoYmlzZWFyY2gobnVtLCBISUdIX0NPTUJJTklORykpIHJldHVybiAwO1xuICAgIGlmICgobnVtID49IDB4MjAwMDAgJiYgbnVtIDw9IDB4MmZmZmQpIHx8IChudW0gPj0gMHgzMDAwMCAmJiBudW0gPD0gMHgzZmZmZCkpIHJldHVybiAyO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcHVibGljIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgbGV0IHdpZHRoID0gdGhpcy53Y3dpZHRoKGNvZGVwb2ludCk7XG4gICAgbGV0IHNob3VsZEpvaW4gPSB3aWR0aCA9PT0gMCAmJiBwcmVjZWRpbmcgIT09IDA7XG4gICAgaWYgKHNob3VsZEpvaW4pIHtcbiAgICAgIGNvbnN0IG9sZFdpZHRoID0gVW5pY29kZVNlcnZpY2UuZXh0cmFjdFdpZHRoKHByZWNlZGluZyk7XG4gICAgICBpZiAob2xkV2lkdGggPT09IDApIHtcbiAgICAgICAgc2hvdWxkSm9pbiA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChvbGRXaWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIHdpZHRoID0gb2xkV2lkdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBVbmljb2RlU2VydmljZS5jcmVhdGVQcm9wZXJ0eVZhbHVlKDAsIHdpZHRoLCBzaG91bGRKb2luKTtcbiAgfVxufVxuIiwiXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuXG5kZWNsYXJlIGNvbnN0IHNldFRpbWVvdXQ6IChoYW5kbGVyOiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKSA9PiB2b2lkO1xuXG4vKipcbiAqIFNhZmV0eSB3YXRlcm1hcmsgdG8gYXZvaWQgbWVtb3J5IGV4aGF1c3Rpb24gYW5kIGJyb3dzZXIgZW5naW5lIGNyYXNoIG9uIGZhc3QgZGF0YSBpbnB1dC5cbiAqIEVuYWJsZSBmbG93IGNvbnRyb2wgdG8gYXZvaWQgdGhpcyBsaW1pdCBhbmQgbWFrZSBzdXJlIHRoYXQgeW91ciBiYWNrZW5kIGNvcnJlY3RseVxuICogcHJvcGFnYXRlcyB0aGlzIHRvIHRoZSB1bmRlcmx5aW5nIHB0eS4gKHNlZSBkb2NzIGZvciBmdXJ0aGVyIGluc3RydWN0aW9ucylcbiAqIFNpbmNlIHRoaXMgbGltaXQgaXMgbWVhbnQgYXMgYSBzYWZldHkgcGFyYWNodXRlIHRvIHByZXZlbnQgYnJvd3NlciBjcmFzaHMsXG4gKiBpdCBpcyBzZXQgdG8gYSB2ZXJ5IGhpZ2ggbnVtYmVyLiBUeXBpY2FsbHkgeHRlcm0uanMgZ2V0cyB1bnJlc3BvbnNpdmUgd2l0aFxuICogYSAxMDAgdGltZXMgbG93ZXIgbnVtYmVyICg+NTAwIGtCKS5cbiAqL1xuY29uc3QgRElTQ0FSRF9XQVRFUk1BUksgPSA1MDAwMDAwMDsgLy8gfjUwIE1CXG5cbi8qKlxuICogVGhlIG1heCBudW1iZXIgb2YgbXMgdG8gc3BlbmQgb24gd3JpdGVzIGJlZm9yZSBhbGxvd2luZyB0aGUgcmVuZGVyZXIgdG9cbiAqIGNhdGNoIHVwIHdpdGggYSAwbXMgc2V0VGltZW91dC4gQSB2YWx1ZSBvZiA8IDMzIHRvIGtlZXAgdXMgY2xvc2UgdG9cbiAqIDMwZnBzLCBhbmQgYSB2YWx1ZSBvZiA8IDE2IHRvIHRyeSB0byBydW4gYXQgNjBmcHMuIE9mIGNvdXJzZSwgdGhlIHJlYWwgRlBTXG4gKiBkZXBlbmRzIG9uIHRoZSB0aW1lIGl0IHRha2VzIGZvciB0aGUgcmVuZGVyZXIgdG8gZHJhdyB0aGUgZnJhbWUuXG4gKi9cbmNvbnN0IFdSSVRFX1RJTUVPVVRfTVMgPSAxMjtcblxuLyoqXG4gKiBUaHJlc2hvbGQgb2YgbWF4IGhlbGQgY2h1bmtzIGluIHRoZSB3cml0ZSBidWZmZXIsIHRoYXQgd2VyZSBhbHJlYWR5IHByb2Nlc3NlZC5cbiAqIFRoaXMgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGV4dGVuc2l2ZSB3cml0ZSBidWZmZXIgc2hpZnRzIChiYWQgcnVudGltZSkgYW5kIGhpZ2hcbiAqIG1lbW9yeSBjb25zdW1wdGlvbiBieSBkYXRhIHRoYXRzIG5vdCB1c2VkIGFueW1vcmUuXG4gKi9cbmNvbnN0IFdSSVRFX0JVRkZFUl9MRU5HVEhfVEhSRVNIT0xEID0gNTA7XG5cbmV4cG9ydCBjbGFzcyBXcml0ZUJ1ZmZlciBleHRlbmRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIF93cml0ZUJ1ZmZlcjogKHN0cmluZyB8IFVpbnQ4QXJyYXkpW10gPSBbXTtcbiAgcHJpdmF0ZSBfY2FsbGJhY2tzOiAoKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkKVtdID0gW107XG4gIHByaXZhdGUgX3BlbmRpbmdEYXRhID0gMDtcbiAgcHJpdmF0ZSBfYnVmZmVyT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBfaXNTeW5jV3JpdGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9zeW5jQ2FsbHMgPSAwO1xuICBwcml2YXRlIF9kaWRVc2VySW5wdXQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbldyaXRlUGFyc2VkID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Xcml0ZVBhcnNlZCA9IHRoaXMuX29uV3JpdGVQYXJzZWQuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYWN0aW9uOiAoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgcHJvbWlzZVJlc3VsdD86IGJvb2xlYW4pID0+IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVVc2VySW5wdXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZGlkVXNlcklucHV0ID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVbnJlbGlhYmxlLCB0byBiZSByZW1vdmVkIHNvb24uXG4gICAqL1xuICBwdWJsaWMgd3JpdGVTeW5jKGRhdGE6IHN0cmluZyB8IFVpbnQ4QXJyYXksIG1heFN1YnNlcXVlbnRDYWxscz86IG51bWJlcik6IHZvaWQge1xuICAgIC8vIHN0b3Agd3JpdGVTeW5jIHJlY3Vyc2lvbnMgd2l0aCBtYXhTdWJzZXF1ZW50Q2FsbHMgYXJndW1lbnRcbiAgICAvLyBUaGlzIGlzIGRhbmdlcm91cyB0byB1c2UgYXMgaXQgd2lsbCBsb3NlIHRoZSBjdXJyZW50IGRhdGEgY2h1bmtcbiAgICAvLyBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LlxuICAgIGlmIChtYXhTdWJzZXF1ZW50Q2FsbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zeW5jQ2FsbHMgPiBtYXhTdWJzZXF1ZW50Q2FsbHMpIHtcbiAgICAgIC8vIGNvbW1lbnQgbmV4dCBsaW5lIGlmIGEgd2hvbGUgbG9vcCBibG9jayBzaG91bGQgb25seSBjb250YWluIHggYHdyaXRlU3luY2AgY2FsbHNcbiAgICAgIC8vICh0b3RhbCBmbGF0IHZzLiBkZWVwIG5lc3RlZCBsaW1pdClcbiAgICAgIHRoaXMuX3N5bmNDYWxscyA9IDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGFwcGVuZCBjaHVuayB0byBidWZmZXJcbiAgICB0aGlzLl9wZW5kaW5nRGF0YSArPSBkYXRhLmxlbmd0aDtcbiAgICB0aGlzLl93cml0ZUJ1ZmZlci5wdXNoKGRhdGEpO1xuICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKHVuZGVmaW5lZCk7XG5cbiAgICAvLyBpbmNyZWFzZSByZWN1cnNpb24gY291bnRlclxuICAgIHRoaXMuX3N5bmNDYWxscysrO1xuICAgIC8vIGV4aXQgZWFybHkgaWYgYW5vdGhlciB3cml0ZVN5bmMgbG9vcCBpcyBhY3RpdmVcbiAgICBpZiAodGhpcy5faXNTeW5jV3JpdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc1N5bmNXcml0aW5nID0gdHJ1ZTtcblxuICAgIC8vIGZvcmNlIHN5bmMgcHJvY2Vzc2luZyBvbiBwZW5kaW5nIGRhdGEgY2h1bmtzIHRvIGF2b2lkIGluLWJhbmQgZGF0YSBzY3JhbWJsaW5nXG4gICAgLy8gZG9lcyB0aGUgc2FtZSBhcyBpbm5lcldyaXRlIGJ1dCB3aXRob3V0IGV2ZW50IGxvb3BcbiAgICAvLyB3ZSBoYXZlIHRvIGRvIGl0IGhlcmUgYXMgc2luZ2xlIGxvb3Agc3RlcHMgdG8gbm90IGNvcnJ1cHQgbG9vcCBzdWJqZWN0XG4gICAgLy8gYnkgYW5vdGhlciB3cml0ZVN5bmMgY2FsbCB0cmlnZ2VyZWQgZnJvbSBfYWN0aW9uXG4gICAgbGV0IGNodW5rOiBzdHJpbmcgfCBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIHdoaWxlIChjaHVuayA9IHRoaXMuX3dyaXRlQnVmZmVyLnNoaWZ0KCkpIHtcbiAgICAgIHRoaXMuX2FjdGlvbihjaHVuayk7XG4gICAgICBjb25zdCBjYiA9IHRoaXMuX2NhbGxiYWNrcy5zaGlmdCgpO1xuICAgICAgaWYgKGNiKSBjYigpO1xuICAgIH1cbiAgICAvLyByZXNldCB0byBhdm9pZCByZXByb2Nlc3Npbmcgb2YgY2h1bmtzIHdpdGggc2NoZWR1bGVkIGlubmVyV3JpdGUgY2FsbFxuICAgIC8vIHN0b3BwaW5nIHNjaGVkdWxlZCBpbm5lcldyaXRlIGJ5IG9mZnNldCA+IGxlbmd0aCBjb25kaXRpb25cbiAgICB0aGlzLl9wZW5kaW5nRGF0YSA9IDA7XG4gICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMHg3RkZGRkZGRjtcblxuICAgIC8vIGFsbG93IGFub3RoZXIgd3JpdGVTeW5jIHRvIGxvb3BcbiAgICB0aGlzLl9pc1N5bmNXcml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5fc3luY0NhbGxzID0gMDtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZShkYXRhOiBzdHJpbmcgfCBVaW50OEFycmF5LCBjYWxsYmFjaz86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ0RhdGEgPiBESVNDQVJEX1dBVEVSTUFSSykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZSBkYXRhIGRpc2NhcmRlZCwgdXNlIGZsb3cgY29udHJvbCB0byBhdm9pZCBsb3NpbmcgZGF0YScpO1xuICAgIH1cblxuICAgIC8vIHNjaGVkdWxlIGNodW5rIHByb2Nlc3NpbmcgZm9yIG5leHQgZXZlbnQgbG9vcCBydW5cbiAgICBpZiAoIXRoaXMuX3dyaXRlQnVmZmVyLmxlbmd0aCkge1xuICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcblxuICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd3JpdGUgY2FsbCBhZnRlciB0aGUgdXNlciBoYXMgZG9uZSBzb21lIGlucHV0LFxuICAgICAgLy8gcGFyc2UgaXQgaW1tZWRpYXRlbHkgdG8gbWluaW1pemUgaW5wdXQgbGF0ZW5jeSxcbiAgICAgIC8vIG90aGVyd2lzZSBzY2hlZHVsZSBmb3IgdGhlIG5leHQgZXZlbnRcbiAgICAgIGlmICh0aGlzLl9kaWRVc2VySW5wdXQpIHtcbiAgICAgICAgdGhpcy5fZGlkVXNlcklucHV0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdEYXRhICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICB0aGlzLl93cml0ZUJ1ZmZlci5wdXNoKGRhdGEpO1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2lubmVyV3JpdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2lubmVyV3JpdGUoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5fcGVuZGluZ0RhdGEgKz0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5fd3JpdGVCdWZmZXIucHVzaChkYXRhKTtcbiAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogSW5uZXIgd3JpdGUgY2FsbCwgdGhhdCBlbnRlcnMgdGhlIHNsaWNlZCBjaHVuayBwcm9jZXNzaW5nIGJ5IHRpbWluZy5cbiAgICpcbiAgICogYGxhc3RUaW1lYCBpbmRpY2F0ZXMsIHdoZW4gdGhlIGxhc3QgX2lubmVyV3JpdGUgY2FsbCBoYWQgc3RhcnRlZC5cbiAgICogSXQgaXMgdXNlZCB0byBhZ2dyZWdhdGUgYXN5bmMgaGFuZGxlciBleGVjdXRpb24gdW5kZXIgYSB0aW1lb3V0IGNvbnN0cmFpbnRcbiAgICogZWZmZWN0aXZlbHkgbG93ZXJpbmcgdGhlIHJlZHJhd2luZyBuZWVkcywgc2NoZW1hdGljYWxseTpcbiAgICpcbiAgICogICBtYWNyb1Rhc2sgX2lubmVyV3JpdGU6XG4gICAqICAgICBpZiAoRGF0ZS5ub3coKSAtIChsYXN0VGltZSB8IDApIDwgV1JJVEVfVElNRU9VVF9NUyk6XG4gICAqICAgICAgICBzY2hlZHVsZSBtaWNyb1Rhc2sgX2lubmVyV3JpdGUobGFzdFRpbWUpXG4gICAqICAgICBlbHNlOlxuICAgKiAgICAgICAgc2NoZWR1bGUgbWFjcm9UYXNrIF9pbm5lcldyaXRlKDApXG4gICAqXG4gICAqICAgb3ZlcmFsbCBleGVjdXRpb24gb3JkZXIgb24gdGFzayBxdWV1ZXM6XG4gICAqXG4gICAqICAgbWFjcm90YXNrczogIFsuLi5dICAtLT4gIF9pbm5lcldyaXRlKDApICAtLT4gIFsuLi5dICAtLT4gIHNjcmVlblVwZGF0ZSAgLS0+ICBbLi4uXVxuICAgKiAgICAgICAgIG0gIHQ6ICAgICAgICAgICAgICAgICAgICB8XG4gICAqICAgICAgICAgaSAgYTogICAgICAgICAgICAgICAgICBbLi4uXVxuICAgKiAgICAgICAgIGMgIHM6ICAgICAgICAgICAgICAgICAgICB8XG4gICAqICAgICAgICAgciAgazogICAgICAgICAgICAgIHdoaWxlIDwgdGltZW91dDpcbiAgICogICAgICAgICBvICBzOiAgICAgICAgICAgICAgICBfaW5uZXJXcml0ZSh0aW1lb3V0KVxuICAgKlxuICAgKiBgcHJvbWlzZVJlc3VsdGAgZGVwaWN0cyB0aGUgcHJvbWlzZSByZXNvbHZlIHZhbHVlIG9mIGFuIGFzeW5jIGhhbmRsZXIuXG4gICAqIFRoaXMgdmFsdWUgZ2V0cyBjYXJyaWVkIGZvcndhcmQgdGhyb3VnaCBhbGwgc2F2ZWQgc3RhY2sgc3RhdGVzIG9mIHRoZVxuICAgKiBwYXVzZWQgcGFyc2VyIGZvciBwcm9wZXIgY29udGludWF0aW9uLlxuICAgKlxuICAgKiBOb3RlLCBmb3IgcHVyZSBzeW5jIGNvZGUgYGxhc3RUaW1lYCBhbmQgYHByb21pc2VSZXN1bHRgIGhhdmUgbm8gbWVhbmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBfaW5uZXJXcml0ZShsYXN0VGltZTogbnVtYmVyID0gMCwgcHJvbWlzZVJlc3VsdDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBsYXN0VGltZSB8fCBEYXRlLm5vdygpO1xuICAgIHdoaWxlICh0aGlzLl93cml0ZUJ1ZmZlci5sZW5ndGggPiB0aGlzLl9idWZmZXJPZmZzZXQpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl93cml0ZUJ1ZmZlclt0aGlzLl9idWZmZXJPZmZzZXRdO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fYWN0aW9uKGRhdGEsIHByb21pc2VSZXN1bHQpO1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogSWYgd2UgZ2V0IGEgcHJvbWlzZSBhcyByZXR1cm4gdmFsdWUsIHdlIHJlLXNjaGVkdWxlIHRoZSBjb250aW51YXRpb25cbiAgICAgICAgICogYXMgdGhlbmFibGUgb24gdGhlIHByb21pc2UgYW5kIGV4aXQgcmlnaHQgYXdheS5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIGV4aXQgaGVyZSBtZWFucywgdGhhdCB3ZSBibG9jayBpbnB1dCBwcm9jZXNzaW5nIGF0IHRoZSBjdXJyZW50IGFjdGl2ZSBjaHVuayxcbiAgICAgICAgICogdGhlIGV4YWN0IGV4ZWN1dGlvbiBwb3NpdGlvbiB3aXRoaW4gdGhlIGNodW5rIGlzIHByZXNlcnZlZCBieSB0aGUgc2F2ZWRcbiAgICAgICAgICogc3RhY2sgY29udGVudCBpbiBJbnB1dEhhbmRsZXIgYW5kIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICAgICAgICAgKlxuICAgICAgICAgKiBSZXN1bWluZyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGF0IHNhdmVkIHN0YWNrIHN0YXRlLlxuICAgICAgICAgKiBBbHNvIHRoZSByZXNvbHZlZCBwcm9taXNlIHZhbHVlIGlzIHBhc3NlZCBhbG9uZyB0aGUgY2FsbHN0YWNrIHRvXG4gICAgICAgICAqIGBFc2NhcGVTZXF1ZW5jZVBhcnNlci5wYXJzZWAgdG8gY29ycmVjdGx5IHJlc3VtZSB0aGUgc3RvcHBlZCBoYW5kbGVyIGxvb3AuXG4gICAgICAgICAqXG4gICAgICAgICAqIEV4Y2VwdGlvbnMgb24gYXN5bmMgaGFuZGxlcnMgd2lsbCBiZSBsb2dnZWQgdG8gY29uc29sZSBhc3luYywgYnV0IGRvIG5vdCBpbnRlcnJ1cHRcbiAgICAgICAgICogdGhlIGlucHV0IHByb2Nlc3NpbmcgKGNvbnRpbnVlcyB3aXRoIG5leHQgaGFuZGxlciBhdCB0aGUgY3VycmVudCBpbnB1dCBwb3NpdGlvbikuXG4gICAgICAgICAqL1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBhIHByb21pc2UgdGFrZXMgbG9uZyB0byByZXNvbHZlLCB3ZSBzaG91bGQgc2NoZWR1bGUgY29udGludWF0aW9uIGJlaGluZCBzZXRUaW1lb3V0LlxuICAgICAgICAgKiBUaGlzIG1pZ2h0IGFscmVhZHkgYmUgdG9vIGxhdGUsIGlmIG91ciAudGhlbiBlbnRlcnMgcmVhbGx5IGxhdGUgKGV4ZWN1dG9yICsgcHJldiB0aGVuc1xuICAgICAgICAgKiB0b29rIHZlcnkgbG9uZykuIFRoaXMgY2Fubm90IGJlIHNvbHZlZCBoZXJlIGZvciB0aGUgaGFuZGxlciBpdHNlbGYgKGl0IGlzIHRoZSBoYW5kbGVyc1xuICAgICAgICAgKiByZXNwb25zaWJpbGl0eSB0byBzbGljZSBoYXJkIHdvcmspLCBidXQgd2UgY2FuIGF0IGxlYXN0IHNjaGVkdWxlIGEgc2NyZWVuIHVwZGF0ZSBhcyB3ZVxuICAgICAgICAgKiBnYWluIGNvbnRyb2wuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBjb250aW51YXRpb246IChyOiBib29sZWFuKSA9PiB2b2lkID0gKHI6IGJvb2xlYW4pID0+IERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gV1JJVEVfVElNRU9VVF9NU1xuICAgICAgICAgID8gc2V0VGltZW91dCgoKSA9PiB0aGlzLl9pbm5lcldyaXRlKDAsIHIpKVxuICAgICAgICAgIDogdGhpcy5faW5uZXJXcml0ZShzdGFydFRpbWUsIHIpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBPcHRpbWl6YXRpb24gY29uc2lkZXJhdGlvbnM6XG4gICAgICAgICAqIFRoZSBjb250aW51YXRpb24gYWJvdmUgZmF2b3JzIEZQUyBvdmVyIHRocm91Z2hwdXQgYnkgZXZhbCdpbmcgYHN0YXJ0VGltZWAgb24gcmVzb2x2ZS5cbiAgICAgICAgICogVGhpcyBtaWdodCBzY2hlZHVsZSB0b28gbWFueSBzY3JlZW4gdXBkYXRlcyB3aXRoIGJhZCB0aHJvdWdocHV0IGRyb3BzIChpbiBjYXNlIGEgc2xvd1xuICAgICAgICAgKiByZXNvbHZpbmcgaGFuZGxlciBzbGljZWQgaXRzIHdvcmsgcHJvcGVybHkgYmVoaW5kIHNldFRpbWVvdXQgY2FsbHMpLiBXZSBjYW5ub3Qgc3BvdFxuICAgICAgICAgKiB0aGlzIGNvbmRpdGlvbiBoZXJlLCBhbHNvIHRoZSByZW5kZXJlciBoYXMgbm8gd2F5IHRvIHNwb3Qgbm9uc2Vuc2UgdXBkYXRlcyBlaXRoZXIuXG4gICAgICAgICAqIEZJWE1FOiBBIHByb3BlciBmaXggZm9yIHRoaXMgd291bGQgdHJhY2sgdGhlIEZQUyBhdCB0aGUgcmVuZGVyZXIgZW50cnkgbGV2ZWwgc2VwYXJhdGVseS5cbiAgICAgICAgICpcbiAgICAgICAgICogSWYgZmF2b3Jpbmcgb2YgRlBTIHNob3dzIGJhZCB0aHJvdWdodHB1dCBpbXBhY3QsIHVzZSB0aGUgZm9sbG93aW5nIGluc3RlYWQuIEl0IGZhdm9yc1xuICAgICAgICAgKiB0aHJvdWdocHV0IGJ5IGV2YWwnaW5nIGBzdGFydFRpbWVgIHVwZnJvbnQgcHVsbGluZyBhdCBsZWFzdCBvbmUgbW9yZSBjaHVuayBpbnRvIHRoZVxuICAgICAgICAgKiBjdXJyZW50IG1pY3JvdGFzayBxdWV1ZSAoZXhlY3V0ZWQgYmVmb3JlIHNldFRpbWVvdXQpLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gY29uc3QgY29udGludWF0aW9uOiAocjogYm9vbGVhbikgPT4gdm9pZCA9IERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gV1JJVEVfVElNRU9VVF9NU1xuICAgICAgICAvLyAgID8gciA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2lubmVyV3JpdGUoMCwgcikpXG4gICAgICAgIC8vICAgOiByID0+IHRoaXMuX2lubmVyV3JpdGUoc3RhcnRUaW1lLCByKTtcblxuICAgICAgICAvLyBIYW5kbGUgZXhjZXB0aW9ucyBzeW5jaHJvbm91c2x5IHRvIGN1cnJlbnQgYmFuZCBwb3NpdGlvbiwgaWRlYTpcbiAgICAgICAgLy8gMS4gc3Bhd24gYSBzaW5nbGUgbWljcm90YXNrIHdoaWNoIHdlIGFsbG93IHRvIHRocm93IGhhcmRcbiAgICAgICAgLy8gMi4gc3Bhd24gYSBwcm9taXNlIGltbWVkaWF0ZWx5IHJlc29sdmluZyB0byBgdHJ1ZWBcbiAgICAgICAgLy8gKGV4ZWN1dGVkIG9uIHRoZSBzYW1lIHF1ZXVlLCB0aHVzIHByb3Blcmx5IGFsaWduZWQgYmVmb3JlIGNvbnRpbnVhdGlvbiBoYXBwZW5zKVxuICAgICAgICByZXN1bHQuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7dGhyb3cgZXJyO30pO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9KS50aGVuKGNvbnRpbnVhdGlvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2IgPSB0aGlzLl9jYWxsYmFja3NbdGhpcy5fYnVmZmVyT2Zmc2V0XTtcbiAgICAgIGlmIChjYikgY2IoKTtcbiAgICAgIHRoaXMuX2J1ZmZlck9mZnNldCsrO1xuICAgICAgdGhpcy5fcGVuZGluZ0RhdGEgLT0gZGF0YS5sZW5ndGg7XG5cbiAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lID49IFdSSVRFX1RJTUVPVVRfTVMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl93cml0ZUJ1ZmZlci5sZW5ndGggPiB0aGlzLl9idWZmZXJPZmZzZXQpIHtcbiAgICAgIC8vIEFsbG93IHJlbmRlcmVyIHRvIGNhdGNoIHVwIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGJhdGNoXG4gICAgICAvLyB0cmltIGFscmVhZHkgcHJvY2Vzc2VkIGNodW5rcyBpZiB3ZSBhcmUgYWJvdmUgdGhyZXNob2xkXG4gICAgICBpZiAodGhpcy5fYnVmZmVyT2Zmc2V0ID4gV1JJVEVfQlVGRkVSX0xFTkdUSF9USFJFU0hPTEQpIHtcbiAgICAgICAgdGhpcy5fd3JpdGVCdWZmZXIgPSB0aGlzLl93cml0ZUJ1ZmZlci5zbGljZSh0aGlzLl9idWZmZXJPZmZzZXQpO1xuICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3Muc2xpY2UodGhpcy5fYnVmZmVyT2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faW5uZXJXcml0ZSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fd3JpdGVCdWZmZXIubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5fcGVuZGluZ0RhdGEgPSAwO1xuICAgICAgdGhpcy5fYnVmZmVyT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy5fb25Xcml0ZVBhcnNlZC5maXJlKCk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuXG4vLyAncmdiOicgcnVsZSAtIG1hdGNoaW5nOiByL2cvYiB8IHJyL2dnL2JiIHwgcnJyL2dnZy9iYmIgfCBycnJyL2dnZ2cvYmJiYiAoaGV4IGRpZ2l0cylcbmNvbnN0IFJHQl9SRVggPSAvXihbXFxkYS1mXSlcXC8oW1xcZGEtZl0pXFwvKFtcXGRhLWZdKSR8XihbXFxkYS1mXXsyfSlcXC8oW1xcZGEtZl17Mn0pXFwvKFtcXGRhLWZdezJ9KSR8XihbXFxkYS1mXXszfSlcXC8oW1xcZGEtZl17M30pXFwvKFtcXGRhLWZdezN9KSR8XihbXFxkYS1mXXs0fSlcXC8oW1xcZGEtZl17NH0pXFwvKFtcXGRhLWZdezR9KSQvO1xuLy8gJyMuLi4nIHJ1bGUgLSBtYXRjaGluZyBhbnkgaGV4IGRpZ2l0c1xuY29uc3QgSEFTSF9SRVggPSAvXltcXGRhLWZdKyQvO1xuXG4vKipcbiAqIFBhcnNlIGNvbG9yIHNwZWMgdG8gUkdCIHZhbHVlcyAoOCBiaXQgcGVyIGNoYW5uZWwpLlxuICogU2VlIGBtYW4geHBhcnNlY29sb3JgIGZvciBkZXRhaWxzIGFib3V0IGNlcnRhaW4gZm9ybWF0IHNwZWNpZmljYXRpb25zLlxuICpcbiAqIFN1cHBvcnRlZCBmb3JtYXRzOlxuICogLSByZ2I6PHJlZD4vPGdyZWVuPi88Ymx1ZT4gd2l0aCA8cmVkPiwgPGdyZWVuPiwgPGJsdWU+IGluIGggfCBoaCB8IGhoaCB8IGhoaGhcbiAqIC0gI1JHQiwgI1JSR0dCQiwgI1JSUkdHR0JCQiwgI1JSUlJHR0dHQkJCQlxuICpcbiAqIEFsbCBvdGhlciBmb3JtYXRzIGxpa2UgcmdiaTogb3IgZGV2aWNlLWluZGVwZW5kZW50IHN0cmluZyBzcGVjaWZpY2F0aW9uc1xuICogd2l0aCBmbG9hdCBudW1iZXJpbmcgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbG9yKGRhdGE6IHN0cmluZyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghZGF0YSkgcmV0dXJuO1xuICAvLyBhbHNvIGhhbmRsZSB1cHBlcmNhc2VzXG4gIGxldCBsb3cgPSBkYXRhLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChsb3cuaW5kZXhPZigncmdiOicpID09PSAwKSB7XG4gICAgLy8gJ3JnYjonIHNwZWNpZmllclxuICAgIGxvdyA9IGxvdy5zbGljZSg0KTtcbiAgICBjb25zdCBtID0gUkdCX1JFWC5leGVjKGxvdyk7XG4gICAgaWYgKG0pIHtcbiAgICAgIGNvbnN0IGJhc2UgPSBtWzFdID8gMTUgOiBtWzRdID8gMjU1IDogbVs3XSA/IDQwOTUgOiA2NTUzNTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIE1hdGgucm91bmQocGFyc2VJbnQobVsxXSB8fCBtWzRdIHx8IG1bN10gfHwgbVsxMF0sIDE2KSAvIGJhc2UgKiAyNTUpLFxuICAgICAgICBNYXRoLnJvdW5kKHBhcnNlSW50KG1bMl0gfHwgbVs1XSB8fCBtWzhdIHx8IG1bMTFdLCAxNikgLyBiYXNlICogMjU1KSxcbiAgICAgICAgTWF0aC5yb3VuZChwYXJzZUludChtWzNdIHx8IG1bNl0gfHwgbVs5XSB8fCBtWzEyXSwgMTYpIC8gYmFzZSAqIDI1NSlcbiAgICAgIF07XG4gICAgfVxuICB9IGVsc2UgaWYgKGxvdy5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAvLyAnIycgc3BlY2lmaWVyXG4gICAgbG93ID0gbG93LnNsaWNlKDEpO1xuICAgIGlmIChIQVNIX1JFWC5leGVjKGxvdykgJiYgWzMsIDYsIDksIDEyXS5pbmNsdWRlcyhsb3cubGVuZ3RoKSkge1xuICAgICAgY29uc3QgYWR2ID0gbG93Lmxlbmd0aCAvIDM7XG4gICAgICBjb25zdCByZXN1bHQ6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFswLCAwLCAwXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgKytpKSB7XG4gICAgICAgIGNvbnN0IGMgPSBwYXJzZUludChsb3cuc2xpY2UoYWR2ICogaSwgYWR2ICogaSArIGFkdiksIDE2KTtcbiAgICAgICAgcmVzdWx0W2ldID0gYWR2ID09PSAxID8gYyA8PCA0IDogYWR2ID09PSAyID8gYyA6IGFkdiA9PT0gMyA/IGMgPj4gNCA6IGMgPj4gODtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gTmFtZWQgY29sb3JzIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBkdWUgdG8gdGhlIGxhcmdlIGFkZGl0aW9uIHRvIHRoZSB4dGVybS5qcyBidW5kbGUgc2l6ZVxuICAvLyB0aGV5IHdvdWxkIGFkZC4gSW4gb3JkZXIgdG8gc3VwcG9ydCBuYW1lZCBjb2xvcnMsIHdlIHdvdWxkIG5lZWQgc29tZSB3YXkgb2Ygb3B0aW9uYWxseSBsb2FkaW5nXG4gIC8vIGFkZGl0aW9uYWwgcGF5bG9hZHMgc28gc3RhcnR1cC9kb3dubG9hZCB0aW1lIGlzIG5vdCBibG9hdGVkIChzZWUgIzM1MzApLlxufVxuXG4vLyBwYWQgaGV4IG91dHB1dCB0byByZXF1ZXN0ZWQgYml0IHdpZHRoXG5mdW5jdGlvbiBwYWQobjogbnVtYmVyLCBiaXRzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBzID0gbi50b1N0cmluZygxNik7XG4gIGNvbnN0IHMyID0gcy5sZW5ndGggPCAyID8gJzAnICsgcyA6IHM7XG4gIHN3aXRjaCAoYml0cykge1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiBzWzBdO1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiBzMjtcbiAgICBjYXNlIDEyOlxuICAgICAgcmV0dXJuIChzMiArIHMyKS5zbGljZSgwLCAzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHMyICsgczI7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgZ2l2ZW4gY29sb3IgdG8gcmdiOi4uLy4uLy4uIHN0cmluZyBvZiBgYml0c2AgZGVwdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1JnYlN0cmluZyhjb2xvcjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBiaXRzOiBudW1iZXIgPSAxNik6IHN0cmluZyB7XG4gIGNvbnN0IFtyLCBnLCBiXSA9IGNvbG9yO1xuICByZXR1cm4gYHJnYjoke3BhZChyLCBiaXRzKX0vJHtwYWQoZywgYml0cyl9LyR7cGFkKGIsIGJpdHMpfWA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgc3RhdGVzIG9mIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBQYXJzZXJTdGF0ZSB7XG4gIEdST1VORCA9IDAsXG4gIEVTQ0FQRSA9IDEsXG4gIEVTQ0FQRV9JTlRFUk1FRElBVEUgPSAyLFxuICBDU0lfRU5UUlkgPSAzLFxuICBDU0lfUEFSQU0gPSA0LFxuICBDU0lfSU5URVJNRURJQVRFID0gNSxcbiAgQ1NJX0lHTk9SRSA9IDYsXG4gIFNPU19QTV9BUENfU1RSSU5HID0gNyxcbiAgT1NDX1NUUklORyA9IDgsXG4gIERDU19FTlRSWSA9IDksXG4gIERDU19QQVJBTSA9IDEwLFxuICBEQ1NfSUdOT1JFID0gMTEsXG4gIERDU19JTlRFUk1FRElBVEUgPSAxMixcbiAgRENTX1BBU1NUSFJPVUdIID0gMTNcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBhY3Rpb25zIG9mIEVzY2FwZVNlcXVlbmNlUGFyc2VyLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBQYXJzZXJBY3Rpb24ge1xuICBJR05PUkUgPSAwLFxuICBFUlJPUiA9IDEsXG4gIFBSSU5UID0gMixcbiAgRVhFQ1VURSA9IDMsXG4gIE9TQ19TVEFSVCA9IDQsXG4gIE9TQ19QVVQgPSA1LFxuICBPU0NfRU5EID0gNixcbiAgQ1NJX0RJU1BBVENIID0gNyxcbiAgUEFSQU0gPSA4LFxuICBDT0xMRUNUID0gOSxcbiAgRVNDX0RJU1BBVENIID0gMTAsXG4gIENMRUFSID0gMTEsXG4gIERDU19IT09LID0gMTIsXG4gIERDU19QVVQgPSAxMyxcbiAgRENTX1VOSE9PSyA9IDE0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc3RhdGVzIG9mIE9zY1BhcnNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gT3NjU3RhdGUge1xuICBTVEFSVCA9IDAsXG4gIElEID0gMSxcbiAgUEFZTE9BRCA9IDIsXG4gIEFCT1JUID0gM1xufVxuXG4vLyBwYXlsb2FkIGxpbWl0IGZvciBPU0MgYW5kIERDU1xuZXhwb3J0IGNvbnN0IFBBWUxPQURfTElNSVQgPSAxMDAwMDAwMDtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSURjc0hhbmRsZXIsIElQYXJhbXMsIElIYW5kbGVyQ29sbGVjdGlvbiwgSURjc1BhcnNlciwgRGNzRmFsbGJhY2tIYW5kbGVyVHlwZSwgSVN1YlBhcnNlclN0YWNrU3RhdGUgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IHV0ZjMyVG9TdHJpbmcgfSBmcm9tICdjb21tb24vaW5wdXQvVGV4dERlY29kZXInO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnY29tbW9uL3BhcnNlci9QYXJhbXMnO1xuaW1wb3J0IHsgUEFZTE9BRF9MSU1JVCB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvQ29uc3RhbnRzJztcblxuY29uc3QgRU1QVFlfSEFORExFUlM6IElEY3NIYW5kbGVyW10gPSBbXTtcblxuZXhwb3J0IGNsYXNzIERjc1BhcnNlciBpbXBsZW1lbnRzIElEY3NQYXJzZXIge1xuICBwcml2YXRlIF9oYW5kbGVyczogSUhhbmRsZXJDb2xsZWN0aW9uPElEY3NIYW5kbGVyPiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHByaXZhdGUgX2FjdGl2ZTogSURjc0hhbmRsZXJbXSA9IEVNUFRZX0hBTkRMRVJTO1xuICBwcml2YXRlIF9pZGVudDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfaGFuZGxlckZiOiBEY3NGYWxsYmFja0hhbmRsZXJUeXBlID0gKCkgPT4geyB9O1xuICBwcml2YXRlIF9zdGFjazogSVN1YlBhcnNlclN0YWNrU3RhdGUgPSB7XG4gICAgcGF1c2VkOiBmYWxzZSxcbiAgICBsb29wUG9zaXRpb246IDAsXG4gICAgZmFsbFRocm91Z2g6IGZhbHNlXG4gIH07XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2hhbmRsZXJGYiA9ICgpID0+IHsgfTtcbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckhhbmRsZXIoaWRlbnQ6IG51bWJlciwgaGFuZGxlcjogSURjc0hhbmRsZXIpOiBJRGlzcG9zYWJsZSB7XG4gICAgaWYgKHRoaXMuX2hhbmRsZXJzW2lkZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9oYW5kbGVyc1tpZGVudF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlckxpc3QgPSB0aGlzLl9oYW5kbGVyc1tpZGVudF07XG4gICAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5kZXggPSBoYW5kbGVyTGlzdC5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaGFuZGxlckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGhhbmRsZXJMaXN0LnNwbGljZShoYW5kbGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckhhbmRsZXIoaWRlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oYW5kbGVyc1tpZGVudF0pIGRlbGV0ZSB0aGlzLl9oYW5kbGVyc1tpZGVudF07XG4gIH1cblxuICBwdWJsaWMgc2V0SGFuZGxlckZhbGxiYWNrKGhhbmRsZXI6IERjc0ZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVyRmIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIC8vIGZvcmNlIGNsZWFudXAgbGVmdG92ZXIgaGFuZGxlcnNcbiAgICBpZiAodGhpcy5fYWN0aXZlLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX3N0YWNrLnBhdXNlZCA/IHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiAtIDEgOiB0aGlzLl9hY3RpdmUubGVuZ3RoIC0gMTsgaiA+PSAwOyAtLWopIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2pdLnVuaG9vayhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZSA9IEVNUFRZX0hBTkRMRVJTO1xuICAgIHRoaXMuX2lkZW50ID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBob29rKGlkZW50OiBudW1iZXIsIHBhcmFtczogSVBhcmFtcyk6IHZvaWQge1xuICAgIC8vIGFsd2F5cyByZXNldCBsZWZ0b3ZlciBoYW5kbGVyc1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICB0aGlzLl9pZGVudCA9IGlkZW50O1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2hhbmRsZXJzW2lkZW50XSB8fCBFTVBUWV9IQU5ETEVSUztcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCwgJ0hPT0snLCBwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5ob29rKHBhcmFtcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHB1dChkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCwgJ1BVVCcsIHV0ZjMyVG9TdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVtqXS5wdXQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVuaG9vayhzdWNjZXNzOiBib29sZWFuLCBwcm9taXNlUmVzdWx0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZGVudCwgJ1VOSE9PSycsIHN1Y2Nlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaGFuZGxlclJlc3VsdDogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gPSBmYWxzZTtcbiAgICAgIGxldCBqID0gdGhpcy5fYWN0aXZlLmxlbmd0aCAtIDE7XG4gICAgICBsZXQgZmFsbFRocm91Z2ggPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLl9zdGFjay5wYXVzZWQpIHtcbiAgICAgICAgaiA9IHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiAtIDE7XG4gICAgICAgIGhhbmRsZXJSZXN1bHQgPSBwcm9taXNlUmVzdWx0O1xuICAgICAgICBmYWxsVGhyb3VnaCA9IHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoO1xuICAgICAgICB0aGlzLl9zdGFjay5wYXVzZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghZmFsbFRocm91Z2ggJiYgaGFuZGxlclJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2FjdGl2ZVtqXS51bmhvb2soc3VjY2Vzcyk7XG4gICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gPSBqO1xuICAgICAgICAgICAgdGhpcy5fc3RhY2suZmFsbFRocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBqLS07XG4gICAgICB9XG4gICAgICAvLyBjbGVhbnVwIGxlZnQgb3ZlciBoYW5kbGVycyAoZmFsbFRocm91Z2ggZm9yIGFzeW5jKVxuICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIGhhbmRsZXJSZXN1bHQgPSB0aGlzLl9hY3RpdmVbal0udW5ob29rKGZhbHNlKTtcbiAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgdGhpcy5fc3RhY2sucGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gPSBqO1xuICAgICAgICAgIHRoaXMuX3N0YWNrLmZhbGxUaHJvdWdoID0gdHJ1ZTtcbiAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgICB0aGlzLl9pZGVudCA9IDA7XG4gIH1cbn1cblxuLy8gcHJlZGVmaW5lIGVtcHR5IHBhcmFtcyBhcyBbMF0gKFpETSlcbmNvbnN0IEVNUFRZX1BBUkFNUyA9IG5ldyBQYXJhbXMoKTtcbkVNUFRZX1BBUkFNUy5hZGRQYXJhbSgwKTtcblxuLyoqXG4gKiBDb252ZW5pZW50IGNsYXNzIHRvIGNyZWF0ZSBhIERDUyBoYW5kbGVyIGZyb20gYSBzaW5nbGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBOb3RlOiBUaGUgcGF5bG9hZCBpcyBjdXJyZW50bHkgbGltaXRlZCB0byA1MCBNQiAoaGFyZGNvZGVkKS5cbiAqL1xuZXhwb3J0IGNsYXNzIERjc0hhbmRsZXIgaW1wbGVtZW50cyBJRGNzSGFuZGxlciB7XG4gIHByaXZhdGUgX2RhdGEgPSAnJztcbiAgcHJpdmF0ZSBfcGFyYW1zOiBJUGFyYW1zID0gRU1QVFlfUEFSQU1TO1xuICBwcml2YXRlIF9oaXRMaW1pdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2hhbmRsZXI6IChkYXRhOiBzdHJpbmcsIHBhcmFtczogSVBhcmFtcykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pIHsgfVxuXG4gIHB1YmxpYyBob29rKHBhcmFtczogSVBhcmFtcyk6IHZvaWQge1xuICAgIC8vIHNpbmNlIHdlIG5lZWQgdG8gcHJlc2VydmUgcGFyYW1zIHVudGlsIGB1bmhvb2tgLCB3ZSBoYXZlIHRvIGNsb25lIGl0XG4gICAgLy8gKG9ubHkgYm9ycm93ZWQgZnJvbSBwYXJzZXIgYW5kIHNwYW5zIG11bHRpcGxlIHBhcnNlciBzdGF0ZXMpXG4gICAgLy8gcGVyZiBvcHRpbWl6YXRpb246XG4gICAgLy8gY2xvbmUgb25seSwgaWYgd2UgaGF2ZSBub24gZW1wdHkgcGFyYW1zLCBvdGhlcndpc2Ugc3RpY2sgd2l0aCBkZWZhdWx0XG4gICAgdGhpcy5fcGFyYW1zID0gKHBhcmFtcy5sZW5ndGggPiAxIHx8IHBhcmFtcy5wYXJhbXNbMF0pID8gcGFyYW1zLmNsb25lKCkgOiBFTVBUWV9QQVJBTVM7XG4gICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgIHRoaXMuX2hpdExpbWl0ID0gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgcHV0KGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhICs9IHV0ZjMyVG9TdHJpbmcoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgaWYgKHRoaXMuX2RhdGEubGVuZ3RoID4gUEFZTE9BRF9MSU1JVCkge1xuICAgICAgdGhpcy5fZGF0YSA9ICcnO1xuICAgICAgdGhpcy5faGl0TGltaXQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmhvb2soc3VjY2VzczogYm9vbGVhbik6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgcmV0OiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiA9IGZhbHNlO1xuICAgIGlmICh0aGlzLl9oaXRMaW1pdCkge1xuICAgICAgcmV0ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChzdWNjZXNzKSB7XG4gICAgICByZXQgPSB0aGlzLl9oYW5kbGVyKHRoaXMuX2RhdGEsIHRoaXMuX3BhcmFtcyk7XG4gICAgICBpZiAocmV0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAvLyBuZWVkIHRvIGhvbGQgZGF0YSBhbmQgcGFyYW1zIHVudGlsIGByZXRgIGdvdCByZXNvbHZlZFxuICAgICAgICAvLyBkb250IGNhcmUgZm9yIGVycm9ycywgZGF0YSB3aWxsIGJlIGZyZWVkIGFueXdheSBvbiBuZXh0IHN0YXJ0XG4gICAgICAgIHJldHVybiByZXQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX3BhcmFtcyA9IEVNUFRZX1BBUkFNUztcbiAgICAgICAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgICAgICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcGFyYW1zID0gRU1QVFlfUEFSQU1TO1xuICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlO1xuICAgIHJldHVybiByZXQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSVBhcnNpbmdTdGF0ZSwgSURjc0hhbmRsZXIsIElFc2NhcGVTZXF1ZW5jZVBhcnNlciwgSVBhcmFtcywgSU9zY0hhbmRsZXIsIElIYW5kbGVyQ29sbGVjdGlvbiwgQ3NpSGFuZGxlclR5cGUsIE9zY0ZhbGxiYWNrSGFuZGxlclR5cGUsIElPc2NQYXJzZXIsIEVzY0hhbmRsZXJUeXBlLCBJRGNzUGFyc2VyLCBEY3NGYWxsYmFja0hhbmRsZXJUeXBlLCBJRnVuY3Rpb25JZGVudGlmaWVyLCBFeGVjdXRlRmFsbGJhY2tIYW5kbGVyVHlwZSwgQ3NpRmFsbGJhY2tIYW5kbGVyVHlwZSwgRXNjRmFsbGJhY2tIYW5kbGVyVHlwZSwgUHJpbnRIYW5kbGVyVHlwZSwgUHJpbnRGYWxsYmFja0hhbmRsZXJUeXBlLCBFeGVjdXRlSGFuZGxlclR5cGUsIElQYXJzZXJTdGFja1N0YXRlLCBQYXJzZXJTdGFja1R5cGUsIFJlc3VtYWJsZUhhbmRsZXJzVHlwZSB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvVHlwZXMnO1xuaW1wb3J0IHsgUGFyc2VyU3RhdGUsIFBhcnNlckFjdGlvbiB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvQ29uc3RhbnRzJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgUGFyYW1zIH0gZnJvbSAnY29tbW9uL3BhcnNlci9QYXJhbXMnO1xuaW1wb3J0IHsgT3NjUGFyc2VyIH0gZnJvbSAnY29tbW9uL3BhcnNlci9Pc2NQYXJzZXInO1xuaW1wb3J0IHsgRGNzUGFyc2VyIH0gZnJvbSAnY29tbW9uL3BhcnNlci9EY3NQYXJzZXInO1xuXG4vKipcbiAqIFRhYmxlIHZhbHVlcyBhcmUgZ2VuZXJhdGVkIGxpa2UgdGhpczpcbiAqICAgIGluZGV4OiAgY3VycmVudFN0YXRlIDw8IFRhYmxlVmFsdWUuSU5ERVhfU1RBVEVfU0hJRlQgfCBjaGFyQ29kZVxuICogICAgdmFsdWU6ICBhY3Rpb24gPDwgVGFibGVWYWx1ZS5UUkFOU0lUSU9OX0FDVElPTl9TSElGVCB8IG5leHRTdGF0ZVxuICovXG5jb25zdCBlbnVtIFRhYmxlQWNjZXNzIHtcbiAgVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQgPSA0LFxuICBUUkFOU0lUSU9OX1NUQVRFX01BU0sgPSAxNSxcbiAgSU5ERVhfU1RBVEVfU0hJRlQgPSA4XG59XG5cbi8qKlxuICogVHJhbnNpdGlvbiB0YWJsZSBmb3IgRXNjYXBlU2VxdWVuY2VQYXJzZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2l0aW9uVGFibGUge1xuICBwdWJsaWMgdGFibGU6IFVpbnQ4QXJyYXk7XG5cbiAgY29uc3RydWN0b3IobGVuZ3RoOiBudW1iZXIpIHtcbiAgICB0aGlzLnRhYmxlID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZGVmYXVsdCB0cmFuc2l0aW9uLlxuICAgKiBAcGFyYW0gYWN0aW9uIGRlZmF1bHQgYWN0aW9uXG4gICAqIEBwYXJhbSBuZXh0IGRlZmF1bHQgbmV4dCBzdGF0ZVxuICAgKi9cbiAgcHVibGljIHNldERlZmF1bHQoYWN0aW9uOiBQYXJzZXJBY3Rpb24sIG5leHQ6IFBhcnNlclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy50YWJsZS5maWxsKGFjdGlvbiA8PCBUYWJsZUFjY2Vzcy5UUkFOU0lUSU9OX0FDVElPTl9TSElGVCB8IG5leHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHRyYW5zaXRpb24gdG8gdGhlIHRyYW5zaXRpb24gdGFibGUuXG4gICAqIEBwYXJhbSBjb2RlIGlucHV0IGNoYXJhY3RlciBjb2RlXG4gICAqIEBwYXJhbSBzdGF0ZSBjdXJyZW50IHBhcnNlciBzdGF0ZVxuICAgKiBAcGFyYW0gYWN0aW9uIHBhcnNlciBhY3Rpb24gdG8gYmUgZG9uZVxuICAgKiBAcGFyYW0gbmV4dCBuZXh0IHBhcnNlciBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGFkZChjb2RlOiBudW1iZXIsIHN0YXRlOiBQYXJzZXJTdGF0ZSwgYWN0aW9uOiBQYXJzZXJBY3Rpb24sIG5leHQ6IFBhcnNlclN0YXRlKTogdm9pZCB7XG4gICAgdGhpcy50YWJsZVtzdGF0ZSA8PCBUYWJsZUFjY2Vzcy5JTkRFWF9TVEFURV9TSElGVCB8IGNvZGVdID0gYWN0aW9uIDw8IFRhYmxlQWNjZXNzLlRSQU5TSVRJT05fQUNUSU9OX1NISUZUIHwgbmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgdHJhbnNpdGlvbnMgZm9yIG11bHRpcGxlIGlucHV0IGNoYXJhY3RlciBjb2Rlcy5cbiAgICogQHBhcmFtIGNvZGVzIGlucHV0IGNoYXJhY3RlciBjb2RlIGFycmF5XG4gICAqIEBwYXJhbSBzdGF0ZSBjdXJyZW50IHBhcnNlciBzdGF0ZVxuICAgKiBAcGFyYW0gYWN0aW9uIHBhcnNlciBhY3Rpb24gdG8gYmUgZG9uZVxuICAgKiBAcGFyYW0gbmV4dCBuZXh0IHBhcnNlciBzdGF0ZVxuICAgKi9cbiAgcHVibGljIGFkZE1hbnkoY29kZXM6IG51bWJlcltdLCBzdGF0ZTogUGFyc2VyU3RhdGUsIGFjdGlvbjogUGFyc2VyQWN0aW9uLCBuZXh0OiBQYXJzZXJTdGF0ZSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMudGFibGVbc3RhdGUgPDwgVGFibGVBY2Nlc3MuSU5ERVhfU1RBVEVfU0hJRlQgfCBjb2Rlc1tpXV0gPSBhY3Rpb24gPDwgVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9BQ1RJT05fU0hJRlQgfCBuZXh0O1xuICAgIH1cbiAgfVxufVxuXG5cbi8vIFBzZXVkby1jaGFyYWN0ZXIgcGxhY2Vob2xkZXIgZm9yIHByaW50YWJsZSBub24tYXNjaWkgY2hhcmFjdGVycyAodW5pY29kZSkuXG5jb25zdCBOT05fQVNDSUlfUFJJTlRBQkxFID0gMHhBMDtcblxuXG4vKipcbiAqIFZUNTAwIGNvbXBhdGlibGUgdHJhbnNpdGlvbiB0YWJsZS5cbiAqIFRha2VuIGZyb20gaHR0cHM6Ly92dDEwMC5uZXQvZW11L2RlY19hbnNpX3BhcnNlci5cbiAqL1xuZXhwb3J0IGNvbnN0IFZUNTAwX1RSQU5TSVRJT05fVEFCTEUgPSAoZnVuY3Rpb24gKCk6IFRyYW5zaXRpb25UYWJsZSB7XG4gIGNvbnN0IHRhYmxlOiBUcmFuc2l0aW9uVGFibGUgPSBuZXcgVHJhbnNpdGlvblRhYmxlKDQwOTUpO1xuXG4gIC8vIHJhbmdlIG1hY3JvIGZvciBieXRlXG4gIGNvbnN0IEJZVEVfVkFMVUVTID0gMjU2O1xuICBjb25zdCBibHVlcHJpbnQgPSBBcnJheS5hcHBseShudWxsLCBBcnJheShCWVRFX1ZBTFVFUykpLm1hcCgodW51c2VkOiBhbnksIGk6IG51bWJlcikgPT4gaSk7XG4gIGNvbnN0IHIgPSAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBudW1iZXJbXSA9PiBibHVlcHJpbnQuc2xpY2Uoc3RhcnQsIGVuZCk7XG5cbiAgLy8gRGVmYXVsdCBkZWZpbml0aW9ucy5cbiAgY29uc3QgUFJJTlRBQkxFUyA9IHIoMHgyMCwgMHg3Zik7IC8vIDB4MjAgKFNQKSBpbmNsdWRlZCwgMHg3RiAoREVMKSBleGNsdWRlZFxuICBjb25zdCBFWEVDVVRBQkxFUyA9IHIoMHgwMCwgMHgxOCk7XG4gIEVYRUNVVEFCTEVTLnB1c2goMHgxOSk7XG4gIEVYRUNVVEFCTEVTLnB1c2guYXBwbHkoRVhFQ1VUQUJMRVMsIHIoMHgxYywgMHgyMCkpO1xuXG4gIGNvbnN0IHN0YXRlczogbnVtYmVyW10gPSByKFBhcnNlclN0YXRlLkdST1VORCwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIICsgMSk7XG4gIGxldCBzdGF0ZTogYW55O1xuXG4gIC8vIHNldCBkZWZhdWx0IHRyYW5zaXRpb25cbiAgdGFibGUuc2V0RGVmYXVsdChQYXJzZXJBY3Rpb24uRVJST1IsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIC8vIHByaW50YWJsZXNcbiAgdGFibGUuYWRkTWFueShQUklOVEFCTEVTLCBQYXJzZXJTdGF0ZS5HUk9VTkQsIFBhcnNlckFjdGlvbi5QUklOVCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgLy8gZ2xvYmFsIGFueXdoZXJlIHJ1bGVzXG4gIGZvciAoc3RhdGUgaW4gc3RhdGVzKSB7XG4gICAgdGFibGUuYWRkTWFueShbMHgxOCwgMHgxYSwgMHg5OSwgMHg5YV0sIHN0YXRlLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgICB0YWJsZS5hZGRNYW55KHIoMHg4MCwgMHg5MCksIHN0YXRlLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgICB0YWJsZS5hZGRNYW55KHIoMHg5MCwgMHg5OCksIHN0YXRlLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgICB0YWJsZS5hZGQoMHg5Yywgc3RhdGUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkdST1VORCk7IC8vIFNUIGFzIHRlcm1pbmF0b3JcbiAgICB0YWJsZS5hZGQoMHgxYiwgc3RhdGUsIFBhcnNlckFjdGlvbi5DTEVBUiwgUGFyc2VyU3RhdGUuRVNDQVBFKTsgIC8vIEVTQ1xuICAgIHRhYmxlLmFkZCgweDlkLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLk9TQ19TVEFSVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7ICAvLyBPU0NcbiAgICB0YWJsZS5hZGRNYW55KFsweDk4LCAweDllLCAweDlmXSwgc3RhdGUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLlNPU19QTV9BUENfU1RSSU5HKTtcbiAgICB0YWJsZS5hZGQoMHg5Yiwgc3RhdGUsIFBhcnNlckFjdGlvbi5DTEVBUiwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZKTsgIC8vIENTSVxuICAgIHRhYmxlLmFkZCgweDkwLCBzdGF0ZSwgUGFyc2VyQWN0aW9uLkNMRUFSLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlkpOyAgLy8gRENTXG4gIH1cbiAgLy8gcnVsZXMgZm9yIGV4ZWN1dGFibGVzIGFuZCA3ZlxuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5HUk9VTkQsIFBhcnNlckFjdGlvbi5FWEVDVVRFLCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5FWEVDVVRFLCBQYXJzZXJTdGF0ZS5FU0NBUEUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5FU0NBUEUpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkNTSV9FTlRSWSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUpO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uRVhFQ1VURSwgUGFyc2VyU3RhdGUuQ1NJX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRVNDQVBFX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkVYRUNVVEUsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuRVNDQVBFX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRVNDQVBFX0lOVEVSTUVESUFURSk7XG4gIC8vIG9zY1xuICB0YWJsZS5hZGQoMHg1ZCwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uT1NDX1NUQVJULCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HKTtcbiAgdGFibGUuYWRkTWFueShQUklOVEFCTEVTLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uT1NDX1BVVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uT1NDX1BVVCwgUGFyc2VyU3RhdGUuT1NDX1NUUklORyk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4OWMsIDB4MWIsIDB4MTgsIDB4MWEsIDB4MDddLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uT1NDX0VORCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MWMsIDB4MjApLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HKTtcbiAgLy8gc29zL3BtL2FwYyBkb2VzIG5vdGhpbmdcbiAgdGFibGUuYWRkTWFueShbMHg1OCwgMHg1ZSwgMHg1Zl0sIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuU09TX1BNX0FQQ19TVFJJTkcpO1xuICB0YWJsZS5hZGRNYW55KFBSSU5UQUJMRVMsIFBhcnNlclN0YXRlLlNPU19QTV9BUENfU1RSSU5HLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORyk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLlNPU19QTV9BUENfU1RSSU5HLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORyk7XG4gIHRhYmxlLmFkZCgweDljLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORywgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLlNPU19QTV9BUENfU1RSSU5HLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5TT1NfUE1fQVBDX1NUUklORyk7XG4gIC8vIGNzaSBlbnRyaWVzXG4gIHRhYmxlLmFkZCgweDViLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5DTEVBUiwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5DU0lfRU5UUlksIFBhcnNlckFjdGlvbi5DU0lfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDNjKSwgUGFyc2VyU3RhdGUuQ1NJX0VOVFJZLCBQYXJzZXJBY3Rpb24uUEFSQU0sIFBhcnNlclN0YXRlLkNTSV9QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4M2MsIDB4M2QsIDB4M2UsIDB4M2ZdLCBQYXJzZXJTdGF0ZS5DU0lfRU5UUlksIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHgzYyksIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLlBBUkFNLCBQYXJzZXJTdGF0ZS5DU0lfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KHIoMHg0MCwgMHg3ZiksIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLkNTSV9ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShbMHgzYywgMHgzZCwgMHgzZSwgMHgzZl0sIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDQwKSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuQ1NJX0lHTk9SRSk7XG4gIHRhYmxlLmFkZCgweDdmLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkNTSV9FTlRSWSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkNTSV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkNTSV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4NDApLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5DU0lfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5DU0lfSU5URVJNRURJQVRFLCBQYXJzZXJBY3Rpb24uQ1NJX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgyMCwgMHgzMCksIFBhcnNlclN0YXRlLkNTSV9QQVJBTSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkNTSV9JTlRFUk1FRElBVEUpO1xuICAvLyBlc2NfaW50ZXJtZWRpYXRlXG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDMwKSwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuRVNDQVBFX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDMwKSwgUGFyc2VyU3RhdGUuRVNDQVBFX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHg3ZiksIFBhcnNlclN0YXRlLkVTQ0FQRV9JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDUwKSwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uRVNDX0RJU1BBVENILCBQYXJzZXJTdGF0ZS5HUk9VTkQpO1xuICB0YWJsZS5hZGRNYW55KHIoMHg1MSwgMHg1OCksIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkVTQ19ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShbMHg1OSwgMHg1YSwgMHg1Y10sIFBhcnNlclN0YXRlLkVTQ0FQRSwgUGFyc2VyQWN0aW9uLkVTQ19ESVNQQVRDSCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NjAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5FU0NBUEUsIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0gsIFBhcnNlclN0YXRlLkdST1VORCk7XG4gIC8vIGRjcyBlbnRyeVxuICB0YWJsZS5hZGQoMHg1MCwgUGFyc2VyU3RhdGUuRVNDQVBFLCBQYXJzZXJBY3Rpb24uQ0xFQVIsIFBhcnNlclN0YXRlLkRDU19FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkRDU19FTlRSWSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZKTtcbiAgdGFibGUuYWRkKDB4N2YsIFBhcnNlclN0YXRlLkRDU19FTlRSWSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MWMsIDB4MjApLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19FTlRSWSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDMwKSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDMwLCAweDNjKSwgUGFyc2VyU3RhdGUuRENTX0VOVFJZLCBQYXJzZXJBY3Rpb24uUEFSQU0sIFBhcnNlclN0YXRlLkRDU19QQVJBTSk7XG4gIHRhYmxlLmFkZE1hbnkoWzB4M2MsIDB4M2QsIDB4M2UsIDB4M2ZdLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5DT0xMRUNULCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KEVYRUNVVEFCTEVTLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MjAsIDB4ODApLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MWMsIDB4MjApLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfSUdOT1JFKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0pO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0pO1xuICB0YWJsZS5hZGRNYW55KHIoMHgxYywgMHgyMCksIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShyKDB4MzAsIDB4M2MpLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0sIFBhcnNlckFjdGlvbi5QQVJBTSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNKTtcbiAgdGFibGUuYWRkTWFueShbMHgzYywgMHgzZCwgMHgzZSwgMHgzZl0sIFBhcnNlclN0YXRlLkRDU19QQVJBTSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDMwKSwgUGFyc2VyU3RhdGUuRENTX1BBUkFNLCBQYXJzZXJBY3Rpb24uQ09MTEVDVCwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkoRVhFQ1VUQUJMRVMsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDFjLCAweDIwKSwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSk7XG4gIHRhYmxlLmFkZE1hbnkocigweDIwLCAweDMwKSwgUGFyc2VyU3RhdGUuRENTX0lOVEVSTUVESUFURSwgUGFyc2VyQWN0aW9uLkNPTExFQ1QsIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHgzMCwgMHg0MCksIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkRDU19JR05PUkUpO1xuICB0YWJsZS5hZGRNYW55KHIoMHg0MCwgMHg3ZiksIFBhcnNlclN0YXRlLkRDU19JTlRFUk1FRElBVEUsIFBhcnNlckFjdGlvbi5EQ1NfSE9PSywgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5EQ1NfUEFSQU0sIFBhcnNlckFjdGlvbi5EQ1NfSE9PSywgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkTWFueShyKDB4NDAsIDB4N2YpLCBQYXJzZXJTdGF0ZS5EQ1NfRU5UUlksIFBhcnNlckFjdGlvbi5EQ1NfSE9PSywgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkTWFueShFWEVDVVRBQkxFUywgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uRENTX1BVVCwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdIKTtcbiAgdGFibGUuYWRkTWFueShQUklOVEFCTEVTLCBQYXJzZXJTdGF0ZS5EQ1NfUEFTU1RIUk9VR0gsIFBhcnNlckFjdGlvbi5EQ1NfUFVULCBQYXJzZXJTdGF0ZS5EQ1NfUEFTU1RIUk9VR0gpO1xuICB0YWJsZS5hZGQoMHg3ZiwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uSUdOT1JFLCBQYXJzZXJTdGF0ZS5EQ1NfUEFTU1RIUk9VR0gpO1xuICB0YWJsZS5hZGRNYW55KFsweDFiLCAweDljLCAweDE4LCAweDFhXSwgUGFyc2VyU3RhdGUuRENTX1BBU1NUSFJPVUdILCBQYXJzZXJBY3Rpb24uRENTX1VOSE9PSywgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgLy8gc3BlY2lhbCBoYW5kbGluZyBvZiB1bmljb2RlIGNoYXJzXG4gIHRhYmxlLmFkZChOT05fQVNDSUlfUFJJTlRBQkxFLCBQYXJzZXJTdGF0ZS5HUk9VTkQsIFBhcnNlckFjdGlvbi5QUklOVCwgUGFyc2VyU3RhdGUuR1JPVU5EKTtcbiAgdGFibGUuYWRkKE5PTl9BU0NJSV9QUklOVEFCTEUsIFBhcnNlclN0YXRlLk9TQ19TVFJJTkcsIFBhcnNlckFjdGlvbi5PU0NfUFVULCBQYXJzZXJTdGF0ZS5PU0NfU1RSSU5HKTtcbiAgdGFibGUuYWRkKE5PTl9BU0NJSV9QUklOVEFCTEUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUsIFBhcnNlckFjdGlvbi5JR05PUkUsIFBhcnNlclN0YXRlLkNTSV9JR05PUkUpO1xuICB0YWJsZS5hZGQoTk9OX0FTQ0lJX1BSSU5UQUJMRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSwgUGFyc2VyQWN0aW9uLklHTk9SRSwgUGFyc2VyU3RhdGUuRENTX0lHTk9SRSk7XG4gIHRhYmxlLmFkZChOT05fQVNDSUlfUFJJTlRBQkxFLCBQYXJzZXJTdGF0ZS5EQ1NfUEFTU1RIUk9VR0gsIFBhcnNlckFjdGlvbi5EQ1NfUFVULCBQYXJzZXJTdGF0ZS5EQ1NfUEFTU1RIUk9VR0gpO1xuICByZXR1cm4gdGFibGU7XG59KSgpO1xuXG5cbi8qKlxuICogRXNjYXBlU2VxdWVuY2VQYXJzZXIuXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIEFOU0kvREVDIGNvbXBhdGlibGUgcGFyc2VyIGRlc2NyaWJlZCBieVxuICogUGF1bCBXaWxsaWFtcyAoaHR0cHM6Ly92dDEwMC5uZXQvZW11L2RlY19hbnNpX3BhcnNlcikuXG4gKlxuICogVG8gaW1wbGVtZW50IGN1c3RvbSBBTlNJIGNvbXBsaWFudCBlc2NhcGUgc2VxdWVuY2VzIGl0IGlzIG5vdCBuZWVkZWQgdG9cbiAqIGFsdGVyIHRoaXMgcGFyc2VyLCBpbnN0ZWFkIGNvbnNpZGVyIHJlZ2lzdGVyaW5nIGEgY3VzdG9tIGhhbmRsZXIuXG4gKiBGb3Igbm9uIEFOU0kgY29tcGxpYW50IHNlcXVlbmNlcyBjaGFuZ2UgdGhlIHRyYW5zaXRpb24gdGFibGUgd2l0aFxuICogdGhlIG9wdGlvbmFsIGB0cmFuc2l0aW9uc2AgY29uc3RydWN0b3IgYXJndW1lbnQgYW5kXG4gKiByZWltcGxlbWVudCB0aGUgYHBhcnNlYCBtZXRob2QuXG4gKlxuICogVGhpcyBwYXJzZXIgaXMgY3VycmVudGx5IGhhcmRjb2RlZCB0byBvcGVyYXRlIGluIFpETSAoWmVybyBEZWZhdWx0IE1vZGUpXG4gKiBhcyBzdWdnZXN0ZWQgYnkgdGhlIG9yaWdpbmFsIHBhcnNlciwgdGh1cyBlbXB0eSBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gMC5cbiAqIFRoaXMgdGhpcyBpcyBub3QgaW4gbGluZSB3aXRoIHRoZSBsYXRlc3QgRUNNQS00OCBzcGVjaWZpY2F0aW9uXG4gKiAoWkRNIHdhcyBwYXJ0IG9mIHRoZSBlYXJseSBzcGVjcyBhbmQgZ290IGNvbXBsZXRlbHkgcmVtb3ZlZCBsYXRlciBvbikuXG4gKlxuICogT3RoZXIgdGhhbiB0aGUgb3JpZ2luYWwgcGFyc2VyIGZyb20gdnQxMDAubmV0IHRoaXMgcGFyc2VyIHN1cHBvcnRzXG4gKiBzdWIgcGFyYW1ldGVycyBpbiBkaWdpdGFsIHBhcmFtZXRlcnMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4gRW1wdHkgc3ViIHBhcmFtZXRlcnNcbiAqIGFyZSBzZXQgdG8gLTEgKG5vIFpETSBmb3Igc3ViIHBhcmFtZXRlcnMpLlxuICpcbiAqIEFib3V0IHByZWZpeCBhbmQgaW50ZXJtZWRpYXRlIGJ5dGVzOlxuICogVGhpcyBwYXJzZXIgZm9sbG93cyB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIHZ0MTAwLm5ldCBwYXJzZXIgd2l0aCB0aGVzZSByZXN0cmljdGlvbnM6XG4gKiAtIG9ubHkgb25lIHByZWZpeCBieXRlIGlzIGFsbG93ZWQgYXMgZmlyc3QgcGFyYW1ldGVyIGJ5dGUsIGJ5dGUgcmFuZ2UgMHgzYyAuLiAweDNmXG4gKiAtIG1heC4gdHdvIGludGVybWVkaWF0ZXMgYXJlIHJlc3BlY3RlZCwgYnl0ZSByYW5nZSAweDIwIC4uIDB4MmZcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBpbiBsaW5lIHdpdGggRUNNQS00OCB3aGljaCBkb2VzIG5vdCBsaW1pdCBlaXRoZXIgb2YgdGhvc2UuXG4gKiBGdXJ0aGVybW9yZSBFQ01BLTQ4IGFsbG93cyB0aGUgcHJlZml4IGJ5dGUgcmFuZ2UgYXQgYW55IHBhcmFtIGJ5dGUgcG9zaXRpb24uIEN1cnJlbnRseVxuICogdGhlcmUgYXJlIG5vIGtub3duIHNlcXVlbmNlcyB0aGF0IGZvbGxvdyB0aGUgYnJvYWRlciBkZWZpbml0aW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLlxuICpcbiAqIFRPRE86IGltcGxlbWVudCBlcnJvciByZWNvdmVyeSBob29rIHZpYSBlcnJvciBoYW5kbGVyIHJldHVybiB2YWx1ZXNcbiAqL1xuZXhwb3J0IGNsYXNzIEVzY2FwZVNlcXVlbmNlUGFyc2VyIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElFc2NhcGVTZXF1ZW5jZVBhcnNlciB7XG4gIHB1YmxpYyBpbml0aWFsU3RhdGU6IG51bWJlcjtcbiAgcHVibGljIGN1cnJlbnRTdGF0ZTogbnVtYmVyO1xuICBwdWJsaWMgcHJlY2VkaW5nSm9pblN0YXRlOiBudW1iZXI7IC8vIFVuaWNvZGVKb2luUHJvcGVydGllc1xuXG4gIC8vIGJ1ZmZlcnMgb3ZlciBzZXZlcmFsIHBhcnNlIGNhbGxzXG4gIHByb3RlY3RlZCBfcGFyYW1zOiBQYXJhbXM7XG4gIHByb3RlY3RlZCBfY29sbGVjdDogbnVtYmVyO1xuXG4gIC8vIGhhbmRsZXIgbG9va3VwIGNvbnRhaW5lcnNcbiAgcHJvdGVjdGVkIF9wcmludEhhbmRsZXI6IFByaW50SGFuZGxlclR5cGU7XG4gIHByb3RlY3RlZCBfZXhlY3V0ZUhhbmRsZXJzOiB7IFtmbGFnOiBudW1iZXJdOiBFeGVjdXRlSGFuZGxlclR5cGUgfTtcbiAgcHJvdGVjdGVkIF9jc2lIYW5kbGVyczogSUhhbmRsZXJDb2xsZWN0aW9uPENzaUhhbmRsZXJUeXBlPjtcbiAgcHJvdGVjdGVkIF9lc2NIYW5kbGVyczogSUhhbmRsZXJDb2xsZWN0aW9uPEVzY0hhbmRsZXJUeXBlPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vc2NQYXJzZXI6IElPc2NQYXJzZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBfZGNzUGFyc2VyOiBJRGNzUGFyc2VyO1xuICBwcm90ZWN0ZWQgX2Vycm9ySGFuZGxlcjogKHN0YXRlOiBJUGFyc2luZ1N0YXRlKSA9PiBJUGFyc2luZ1N0YXRlO1xuXG4gIC8vIGZhbGxiYWNrIGhhbmRsZXJzXG4gIHByb3RlY3RlZCBfcHJpbnRIYW5kbGVyRmI6IFByaW50RmFsbGJhY2tIYW5kbGVyVHlwZTtcbiAgcHJvdGVjdGVkIF9leGVjdXRlSGFuZGxlckZiOiBFeGVjdXRlRmFsbGJhY2tIYW5kbGVyVHlwZTtcbiAgcHJvdGVjdGVkIF9jc2lIYW5kbGVyRmI6IENzaUZhbGxiYWNrSGFuZGxlclR5cGU7XG4gIHByb3RlY3RlZCBfZXNjSGFuZGxlckZiOiBFc2NGYWxsYmFja0hhbmRsZXJUeXBlO1xuICBwcm90ZWN0ZWQgX2Vycm9ySGFuZGxlckZiOiAoc3RhdGU6IElQYXJzaW5nU3RhdGUpID0+IElQYXJzaW5nU3RhdGU7XG5cbiAgLy8gcGFyc2VyIHN0YWNrIHNhdmUgZm9yIGFzeW5jIGhhbmRsZXIgc3VwcG9ydFxuICBwcm90ZWN0ZWQgX3BhcnNlU3RhY2s6IElQYXJzZXJTdGFja1N0YXRlID0ge1xuICAgIHN0YXRlOiBQYXJzZXJTdGFja1R5cGUuTk9ORSxcbiAgICBoYW5kbGVyczogW10sXG4gICAgaGFuZGxlclBvczogMCxcbiAgICB0cmFuc2l0aW9uOiAwLFxuICAgIGNodW5rUG9zOiAwXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF90cmFuc2l0aW9uczogVHJhbnNpdGlvblRhYmxlID0gVlQ1MDBfVFJBTlNJVElPTl9UQUJMRVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5pbml0aWFsU3RhdGUgPSBQYXJzZXJTdGF0ZS5HUk9VTkQ7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmluaXRpYWxTdGF0ZTtcbiAgICB0aGlzLl9wYXJhbXMgPSBuZXcgUGFyYW1zKCk7IC8vIGRlZmF1bHRzIHRvIDMyIHN0b3JhYmxlIHBhcmFtcy9zdWJwYXJhbXNcbiAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7ICAgIC8vIFpETVxuICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcblxuICAgIC8vIHNldCBkZWZhdWx0IGZhbGxiYWNrIGhhbmRsZXJzIGFuZCBoYW5kbGVyIGxvb2t1cCBjb250YWluZXJzXG4gICAgdGhpcy5fcHJpbnRIYW5kbGVyRmIgPSAoZGF0YSwgc3RhcnQsIGVuZCk6IHZvaWQgPT4geyB9O1xuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVyRmIgPSAoY29kZTogbnVtYmVyKTogdm9pZCA9PiB7IH07XG4gICAgdGhpcy5fY3NpSGFuZGxlckZiID0gKGlkZW50OiBudW1iZXIsIHBhcmFtczogSVBhcmFtcyk6IHZvaWQgPT4geyB9O1xuICAgIHRoaXMuX2VzY0hhbmRsZXJGYiA9IChpZGVudDogbnVtYmVyKTogdm9pZCA9PiB7IH07XG4gICAgdGhpcy5fZXJyb3JIYW5kbGVyRmIgPSAoc3RhdGU6IElQYXJzaW5nU3RhdGUpOiBJUGFyc2luZ1N0YXRlID0+IHN0YXRlO1xuICAgIHRoaXMuX3ByaW50SGFuZGxlciA9IHRoaXMuX3ByaW50SGFuZGxlckZiO1xuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fY3NpSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2VzY0hhbmRsZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jc2lIYW5kbGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB0aGlzLl9leGVjdXRlSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgdGhpcy5fZXNjSGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH0pKTtcbiAgICB0aGlzLl9vc2NQYXJzZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBPc2NQYXJzZXIoKSk7XG4gICAgdGhpcy5fZGNzUGFyc2VyID0gdGhpcy5yZWdpc3RlcihuZXcgRGNzUGFyc2VyKCkpO1xuICAgIHRoaXMuX2Vycm9ySGFuZGxlciA9IHRoaXMuX2Vycm9ySGFuZGxlckZiO1xuXG4gICAgLy8gc3dhbGxvdyA3Yml0IFNUIChFU0MrXFwpXG4gICAgdGhpcy5yZWdpc3RlckVzY0hhbmRsZXIoeyBmaW5hbDogJ1xcXFwnIH0sICgpID0+IHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9pZGVudGlmaWVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBmaW5hbFJhbmdlOiBudW1iZXJbXSA9IFsweDQwLCAweDdlXSk6IG51bWJlciB7XG4gICAgbGV0IHJlcyA9IDA7XG4gICAgaWYgKGlkLnByZWZpeCkge1xuICAgICAgaWYgKGlkLnByZWZpeC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25seSBvbmUgYnl0ZSBhcyBwcmVmaXggc3VwcG9ydGVkJyk7XG4gICAgICB9XG4gICAgICByZXMgPSBpZC5wcmVmaXguY2hhckNvZGVBdCgwKTtcbiAgICAgIGlmIChyZXMgJiYgMHgzYyA+IHJlcyB8fCByZXMgPiAweDNmKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncHJlZml4IG11c3QgYmUgaW4gcmFuZ2UgMHgzYyAuLiAweDNmJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpZC5pbnRlcm1lZGlhdGVzKSB7XG4gICAgICBpZiAoaWQuaW50ZXJtZWRpYXRlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb25seSB0d28gYnl0ZXMgYXMgaW50ZXJtZWRpYXRlcyBhcmUgc3VwcG9ydGVkJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkLmludGVybWVkaWF0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlID0gaWQuaW50ZXJtZWRpYXRlcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoMHgyMCA+IGludGVybWVkaWF0ZSB8fCBpbnRlcm1lZGlhdGUgPiAweDJmKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnRlcm1lZGlhdGUgbXVzdCBiZSBpbiByYW5nZSAweDIwIC4uIDB4MmYnKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPDw9IDg7XG4gICAgICAgIHJlcyB8PSBpbnRlcm1lZGlhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpZC5maW5hbC5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmluYWwgbXVzdCBiZSBhIHNpbmdsZSBieXRlJyk7XG4gICAgfVxuICAgIGNvbnN0IGZpbmFsQ29kZSA9IGlkLmZpbmFsLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGZpbmFsUmFuZ2VbMF0gPiBmaW5hbENvZGUgfHwgZmluYWxDb2RlID4gZmluYWxSYW5nZVsxXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmaW5hbCBtdXN0IGJlIGluIHJhbmdlICR7ZmluYWxSYW5nZVswXX0gLi4gJHtmaW5hbFJhbmdlWzFdfWApO1xuICAgIH1cbiAgICByZXMgPDw9IDg7XG4gICAgcmVzIHw9IGZpbmFsQ29kZTtcblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwdWJsaWMgaWRlbnRUb1N0cmluZyhpZGVudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXM6IHN0cmluZ1tdID0gW107XG4gICAgd2hpbGUgKGlkZW50KSB7XG4gICAgICByZXMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGlkZW50ICYgMHhGRikpO1xuICAgICAgaWRlbnQgPj49IDg7XG4gICAgfVxuICAgIHJldHVybiByZXMucmV2ZXJzZSgpLmpvaW4oJycpO1xuICB9XG5cbiAgcHVibGljIHNldFByaW50SGFuZGxlcihoYW5kbGVyOiBQcmludEhhbmRsZXJUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fcHJpbnRIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuICBwdWJsaWMgY2xlYXJQcmludEhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJpbnRIYW5kbGVyID0gdGhpcy5fcHJpbnRIYW5kbGVyRmI7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJFc2NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBoYW5kbGVyOiBFc2NIYW5kbGVyVHlwZSk6IElEaXNwb3NhYmxlIHtcbiAgICBjb25zdCBpZGVudCA9IHRoaXMuX2lkZW50aWZpZXIoaWQsIFsweDMwLCAweDdlXSk7XG4gICAgaWYgKHRoaXMuX2VzY0hhbmRsZXJzW2lkZW50XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9lc2NIYW5kbGVyc1tpZGVudF0gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgaGFuZGxlckxpc3QgPSB0aGlzLl9lc2NIYW5kbGVyc1tpZGVudF07XG4gICAgaGFuZGxlckxpc3QucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5kZXggPSBoYW5kbGVyTGlzdC5pbmRleE9mKGhhbmRsZXIpO1xuICAgICAgICBpZiAoaGFuZGxlckluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGhhbmRsZXJMaXN0LnNwbGljZShoYW5kbGVySW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBwdWJsaWMgY2xlYXJFc2NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2VzY0hhbmRsZXJzW3RoaXMuX2lkZW50aWZpZXIoaWQsIFsweDMwLCAweDdlXSldKSBkZWxldGUgdGhpcy5fZXNjSGFuZGxlcnNbdGhpcy5faWRlbnRpZmllcihpZCwgWzB4MzAsIDB4N2VdKV07XG4gIH1cbiAgcHVibGljIHNldEVzY0hhbmRsZXJGYWxsYmFjayhoYW5kbGVyOiBFc2NGYWxsYmFja0hhbmRsZXJUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fZXNjSGFuZGxlckZiID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeGVjdXRlSGFuZGxlcihmbGFnOiBzdHJpbmcsIGhhbmRsZXI6IEV4ZWN1dGVIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVyc1tmbGFnLmNoYXJDb2RlQXQoMCldID0gaGFuZGxlcjtcbiAgfVxuICBwdWJsaWMgY2xlYXJFeGVjdXRlSGFuZGxlcihmbGFnOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0ZUhhbmRsZXJzW2ZsYWcuY2hhckNvZGVBdCgwKV0pIGRlbGV0ZSB0aGlzLl9leGVjdXRlSGFuZGxlcnNbZmxhZy5jaGFyQ29kZUF0KDApXTtcbiAgfVxuICBwdWJsaWMgc2V0RXhlY3V0ZUhhbmRsZXJGYWxsYmFjayhoYW5kbGVyOiBFeGVjdXRlRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVyRmIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyQ3NpSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgaGFuZGxlcjogQ3NpSGFuZGxlclR5cGUpOiBJRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgaWRlbnQgPSB0aGlzLl9pZGVudGlmaWVyKGlkKTtcbiAgICBpZiAodGhpcy5fY3NpSGFuZGxlcnNbaWRlbnRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX2NzaUhhbmRsZXJzW2lkZW50XSA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBoYW5kbGVyTGlzdCA9IHRoaXMuX2NzaUhhbmRsZXJzW2lkZW50XTtcbiAgICBoYW5kbGVyTGlzdC5wdXNoKGhhbmRsZXIpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmRleCA9IGhhbmRsZXJMaXN0LmluZGV4T2YoaGFuZGxlcik7XG4gICAgICAgIGlmIChoYW5kbGVySW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgaGFuZGxlckxpc3Quc3BsaWNlKGhhbmRsZXJJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHB1YmxpYyBjbGVhckNzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY3NpSGFuZGxlcnNbdGhpcy5faWRlbnRpZmllcihpZCldKSBkZWxldGUgdGhpcy5fY3NpSGFuZGxlcnNbdGhpcy5faWRlbnRpZmllcihpZCldO1xuICB9XG4gIHB1YmxpYyBzZXRDc2lIYW5kbGVyRmFsbGJhY2soY2FsbGJhY2s6IChpZGVudDogbnVtYmVyLCBwYXJhbXM6IElQYXJhbXMpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jc2lIYW5kbGVyRmIgPSBjYWxsYmFjaztcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckRjc0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGhhbmRsZXI6IElEY3NIYW5kbGVyKTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9kY3NQYXJzZXIucmVnaXN0ZXJIYW5kbGVyKHRoaXMuX2lkZW50aWZpZXIoaWQpLCBoYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyKTogdm9pZCB7XG4gICAgdGhpcy5fZGNzUGFyc2VyLmNsZWFySGFuZGxlcih0aGlzLl9pZGVudGlmaWVyKGlkKSk7XG4gIH1cbiAgcHVibGljIHNldERjc0hhbmRsZXJGYWxsYmFjayhoYW5kbGVyOiBEY3NGYWxsYmFja0hhbmRsZXJUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fZGNzUGFyc2VyLnNldEhhbmRsZXJGYWxsYmFjayhoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9zY0hhbmRsZXIoaWRlbnQ6IG51bWJlciwgaGFuZGxlcjogSU9zY0hhbmRsZXIpOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX29zY1BhcnNlci5yZWdpc3RlckhhbmRsZXIoaWRlbnQsIGhhbmRsZXIpO1xuICB9XG4gIHB1YmxpYyBjbGVhck9zY0hhbmRsZXIoaWRlbnQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX29zY1BhcnNlci5jbGVhckhhbmRsZXIoaWRlbnQpO1xuICB9XG4gIHB1YmxpYyBzZXRPc2NIYW5kbGVyRmFsbGJhY2soaGFuZGxlcjogT3NjRmFsbGJhY2tIYW5kbGVyVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX29zY1BhcnNlci5zZXRIYW5kbGVyRmFsbGJhY2soaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgc2V0RXJyb3JIYW5kbGVyKGNhbGxiYWNrOiAoc3RhdGU6IElQYXJzaW5nU3RhdGUpID0+IElQYXJzaW5nU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9lcnJvckhhbmRsZXIgPSBjYWxsYmFjaztcbiAgfVxuICBwdWJsaWMgY2xlYXJFcnJvckhhbmRsZXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZXJyb3JIYW5kbGVyID0gdGhpcy5fZXJyb3JIYW5kbGVyRmI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcGFyc2VyIHRvIGluaXRpYWwgdmFsdWVzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gbGlmdCB0aGUgaW1wcm9wZXIgY29udGludWF0aW9uIGVycm9yIGNvbmRpdGlvblxuICAgKiB3aGVuIGRlYWxpbmcgd2l0aCBhc3luYyBoYW5kbGVycy4gVXNlIHRoaXMgb25seSBhcyBhIGxhc3QgcmVzb3J0IHRvIHNpbGVuY2VcbiAgICogdGhhdCBlcnJvciB3aGVuIHRoZSB0ZXJtaW5hbCBoYXMgbm8gcGVuZGluZyBkYXRhIHRvIGJlIHByb2Nlc3NlZC4gTm90ZSB0aGF0XG4gICAqIHRoZSBpbnRlcnJ1cHRlZCBhc3luYyBoYW5kbGVyIG1pZ2h0IGNvbnRpbnVlIGl0cyB3b3JrIGluIHRoZSBmdXR1cmUgbWVzc2luZ1xuICAgKiB1cCB0aGUgdGVybWluYWwgc3RhdGUgZXZlbiBmdXJ0aGVyLlxuICAgKi9cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5pbml0aWFsU3RhdGU7XG4gICAgdGhpcy5fb3NjUGFyc2VyLnJlc2V0KCk7XG4gICAgdGhpcy5fZGNzUGFyc2VyLnJlc2V0KCk7XG4gICAgdGhpcy5fcGFyYW1zLnJlc2V0KCk7XG4gICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAvLyBaRE1cbiAgICB0aGlzLl9jb2xsZWN0ID0gMDtcbiAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG4gICAgLy8gYWJvcnQgcGVuZGluZyBjb250aW51YXRpb24gZnJvbSBhc3luYyBoYW5kbGVyXG4gICAgLy8gSGVyZSB0aGUgUkVTRVQgdHlwZSBpbmRpY2F0ZXMsIHRoYXQgdGhlIG5leHQgcGFyc2UgY2FsbCB3aWxsXG4gICAgLy8gaWdub3JlIGFueSBzYXZlZCBzdGFjaywgaW5zdGVhZCBjb250aW51ZXMgc3luYyB3aXRoIG5leHQgY29kZXBvaW50IGZyb20gR1JPVU5EXG4gICAgaWYgKHRoaXMuX3BhcnNlU3RhY2suc3RhdGUgIT09IFBhcnNlclN0YWNrVHlwZS5OT05FKSB7XG4gICAgICB0aGlzLl9wYXJzZVN0YWNrLnN0YXRlID0gUGFyc2VyU3RhY2tUeXBlLlJFU0VUO1xuICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycyA9IFtdOyAvLyBhbHNvIHJlbGVhc2UgaGFuZGxlcnMgcmVmXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIHBhcnNlIHN1cHBvcnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ByZXNlcnZlU3RhY2soXG4gICAgc3RhdGU6IFBhcnNlclN0YWNrVHlwZSxcbiAgICBoYW5kbGVyczogUmVzdW1hYmxlSGFuZGxlcnNUeXBlLFxuICAgIGhhbmRsZXJQb3M6IG51bWJlcixcbiAgICB0cmFuc2l0aW9uOiBudW1iZXIsXG4gICAgY2h1bmtQb3M6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycyA9IGhhbmRsZXJzO1xuICAgIHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlclBvcyA9IGhhbmRsZXJQb3M7XG4gICAgdGhpcy5fcGFyc2VTdGFjay50cmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcbiAgICB0aGlzLl9wYXJzZVN0YWNrLmNodW5rUG9zID0gY2h1bmtQb3M7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgVVRGMzIgY29kZXBvaW50cyBpbiBgZGF0YWAgdXAgdG8gYGxlbmd0aGAuXG4gICAqXG4gICAqIE5vdGU6IEZvciBzZXZlcmFsIGFjdGlvbnMgd2l0aCBoaWdoIGRhdGEgbG9hZCB0aGUgcGFyc2luZyBpcyBvcHRpbWl6ZWRcbiAgICogYnkgdXNpbmcgbG9jYWwgcmVhZCBhaGVhZCBsb29wcyB3aXRoIGhhcmRjb2RlZCBjb25kaXRpb25zIHRvXG4gICAqIGF2b2lkIGNvc3RseSB0YWJsZSBsb29rdXBzLiBNYWtlIHN1cmUgdGhhdCBhbnkgY2hhbmdlIG9mIHRhYmxlIHZhbHVlc1xuICAgKiB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgbG9vcCBjb25kaXRpb25zIGFzIHdlbGwgYW5kIHZpY2UgdmVyc2EuXG4gICAqIEFmZmVjdGVkIHN0YXRlcy9hY3Rpb25zOlxuICAgKiAtIEdST1VORDpQUklOVFxuICAgKiAtIENTSV9QQVJBTTpQQVJBTVxuICAgKiAtIERDU19QQVJBTTpQQVJBTVxuICAgKiAtIE9TQ19TVFJJTkc6T1NDX1BVVFxuICAgKiAtIERDU19QQVNTVEhST1VHSDpEQ1NfUFVUXG4gICAqXG4gICAqIE5vdGUgb24gYXN5bmNocm9ub3VzIGhhbmRsZXIgc3VwcG9ydDpcbiAgICogQW55IGhhbmRsZXIgcmV0dXJuaW5nIGEgcHJvbWlzZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYXN5bmNocm9ub3VzLlxuICAgKiBUbyBrZWVwIHRoZSBpbi1iYW5kIGJsb2NraW5nIHdvcmtpbmcgZm9yIGFzeW5jIGhhbmRsZXJzLCBgcGFyc2VgIHBhdXNlcyBleGVjdXRpb24sXG4gICAqIGNyZWF0ZXMgYSBzdGFjayBzYXZlIGFuZCByZXR1cm5zIHRoZSBwcm9taXNlIHRvIHRoZSBjYWxsZXIuXG4gICAqIEZvciBwcm9wZXIgY29udGludWF0aW9uIG9mIHRoZSBwYXVzZWQgc3RhdGUgaXQgaXMgaW1wb3J0YW50XG4gICAqIHRvIGF3YWl0IHRoZSBwcm9taXNlIHJlc29sdmluZy4gT24gcmVzb2x2ZSB0aGUgcGFyc2UgbXVzdCBiZSByZXBlYXRlZFxuICAgKiB3aXRoIHRoZSBzYW1lIGNodW5rIG9mIGRhdGEgYW5kIHRoZSByZXNvbHZlZCB2YWx1ZSBpbiBgcHJvbWlzZVJlc3VsdGBcbiAgICogdW50aWwgbm8gcHJvbWlzZSBpcyByZXR1cm5lZC5cbiAgICpcbiAgICogSW1wb3J0YW50OiBXaXRoIG9ubHkgc3luYyBoYW5kbGVycyBkZWZpbmVkLCBwYXJzaW5nIGlzIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgYXMgd2VsbC5cbiAgICogQXMgc29vbiBhcyBhbiBhc3luYyBoYW5kbGVyIGlzIGludm9sdmVkLCBzeW5jaHJvbm91cyBwYXJzaW5nIGlzIG5vdCBwb3NzaWJsZSBhbnltb3JlLlxuICAgKlxuICAgKiBCb2lsZXJwbGF0ZSBmb3IgcHJvcGVyIHBhcnNpbmcgb2YgbXVsdGlwbGUgY2h1bmtzIHdpdGggYXN5bmMgaGFuZGxlcnM6XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXN5bmMgZnVuY3Rpb24gcGFyc2VNdWx0aXBsZUNodW5rcyhjaHVua3M6IFVpbnQzMkFycmF5W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICogICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgKiAgICAgbGV0IHJlc3VsdDogdm9pZCB8IFByb21pc2U8Ym9vbGVhbj47XG4gICAqICAgICBsZXQgcHJldjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICogICAgIHdoaWxlIChyZXN1bHQgPSBwYXJzZXIucGFyc2UoY2h1bmssIGNodW5rLmxlbmd0aCwgcHJldikpIHtcbiAgICogICAgICAgcHJldiA9IGF3YWl0IHJlc3VsdDtcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqICAgLy8gZmluaXNoZWQgcGFyc2luZyBhbGwgY2h1bmtzLi4uXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgcGFyc2UoZGF0YTogVWludDMyQXJyYXksIGxlbmd0aDogbnVtYmVyLCBwcm9taXNlUmVzdWx0PzogYm9vbGVhbik6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBsZXQgY29kZSA9IDA7XG4gICAgbGV0IHRyYW5zaXRpb24gPSAwO1xuICAgIGxldCBzdGFydCA9IDA7XG4gICAgbGV0IGhhbmRsZXJSZXN1bHQ6IHZvaWQgfCBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICAgIC8vIHJlc3VtZSBmcm9tIGFzeW5jIGhhbmRsZXJcbiAgICBpZiAodGhpcy5fcGFyc2VTdGFjay5zdGF0ZSkge1xuICAgICAgLy8gYWxsb3cgc3luYyBwYXJzZXIgcmVzZXQgZXZlbiBpbiBjb250aW51YXRpb24gbW9kZVxuICAgICAgLy8gTm90ZTogY2FuIGJlIHVzZWQgdG8gcmVjb3ZlciBwYXJzZXIgZnJvbSBpbXByb3BlciBjb250aW51YXRpb24gZXJyb3IgYmVsb3dcbiAgICAgIGlmICh0aGlzLl9wYXJzZVN0YWNrLnN0YXRlID09PSBQYXJzZXJTdGFja1R5cGUuUkVTRVQpIHtcbiAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5zdGF0ZSA9IFBhcnNlclN0YWNrVHlwZS5OT05FO1xuICAgICAgICBzdGFydCA9IHRoaXMuX3BhcnNlU3RhY2suY2h1bmtQb3MgKyAxOyAvLyBjb250aW51ZSB3aXRoIG5leHQgY29kZXBvaW50IGluIEdST1VORFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb21pc2VSZXN1bHQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLl9wYXJzZVN0YWNrLnN0YXRlID09PSBQYXJzZXJTdGFja1R5cGUuRkFJTCkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFJlamVjdCBmdXJ0aGVyIHBhcnNpbmcgb24gaW1wcm9wZXIgY29udGludWF0aW9uIGFmdGVyIHBhdXNpbmcuIFRoaXMgaXMgYSByZWFsbHkgYmFkXG4gICAgICAgICAgICogY29uZGl0aW9uIHdpdGggc2NyZXdlZCB1cCBleGVjdXRpb24gb3JkZXIgYW5kIHByb2xseSBtZXNzZWQgdXAgdGVybWluYWwgc3RhdGUsXG4gICAgICAgICAgICogdGhlcmVmb3JlIHdlIGV4aXQgaGFyZCB3aXRoIGFuIGV4Y2VwdGlvbiBhbmQgcmVqZWN0IGFueSBmdXJ0aGVyIHBhcnNpbmcuXG4gICAgICAgICAgICpcbiAgICAgICAgICAgKiBOb3RlOiBXaXRoIGBUZXJtaW5hbC53cml0ZWAgdXNhZ2UgdGhpcyBleGNlcHRpb24gc2hvdWxkIG5ldmVyIG9jY3VyLCBhcyB0aGUgdG9wIGxldmVsXG4gICAgICAgICAgICogY2FsbHMgYXJlIGd1YXJhbnRlZWQgdG8gaGFuZGxlIGFzeW5jIGNvbmRpdGlvbnMgcHJvcGVybHkuIElmIHlvdSBldmVyIGVuY291bnRlciB0aGlzXG4gICAgICAgICAgICogZXhjZXB0aW9uIGluIHlvdXIgdGVybWluYWwgaW50ZWdyYXRpb24gaXQgaW5kaWNhdGVzLCB0aGF0IHlvdSBpbmplY3RlZCBkYXRhIGNodW5rcyB0b1xuICAgICAgICAgICAqIGBJbnB1dEhhbmRsZXIucGFyc2VgIG9yIGBFc2NhcGVTZXF1ZW5jZVBhcnNlci5wYXJzZWAgc3luY2hyb25vdXNseSB3aXRob3V0IHdhaXRpbmcgZm9yXG4gICAgICAgICAgICogY29udGludWF0aW9uIG9mIGEgcnVubmluZyBhc3luYyBoYW5kbGVyLlxuICAgICAgICAgICAqXG4gICAgICAgICAgICogSXQgaXMgcG9zc2libGUgdG8gZ2V0IHJpZCBvZiB0aGlzIGVycm9yIGJ5IGNhbGxpbmcgYHJlc2V0YC4gQnV0IGRvbnQgcmVseSBvbiB0aGF0LCBhc1xuICAgICAgICAgICAqIHRoZSBwZW5kaW5nIGFzeW5jIGhhbmRsZXIgc3RpbGwgbWlnaHQgbWVzcyB1cCB0aGUgdGVybWluYWwgbGF0ZXIuIEluc3RlYWQgZml4IHRoZVxuICAgICAgICAgICAqIGZhdWx0eSBhc3luYyBoYW5kbGluZywgc28gdGhpcyBlcnJvciB3aWxsIG5vdCBiZSB0aHJvd24gYW55bW9yZS5cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzLl9wYXJzZVN0YWNrLnN0YXRlID0gUGFyc2VyU3RhY2tUeXBlLkZBSUw7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbXByb3BlciBjb250aW51YXRpb24gZHVlIHRvIHByZXZpb3VzIGFzeW5jIGhhbmRsZXIsIGdpdmluZyB1cCBwYXJzaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBoYXZlIHRvIHJlc3VtZSB0aGUgb2xkIGhhbmRsZXIgbG9vcCBpZjpcbiAgICAgICAgLy8gLSByZXR1cm4gdmFsdWUgb2YgdGhlIHByb21pc2Ugd2FzIGBmYWxzZWBcbiAgICAgICAgLy8gLSBoYW5kbGVycyBhcmUgbm90IGV4aGF1c3RlZCB5ZXRcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJzO1xuICAgICAgICBsZXQgaGFuZGxlclBvcyA9IHRoaXMuX3BhcnNlU3RhY2suaGFuZGxlclBvcyAtIDE7XG4gICAgICAgIHN3aXRjaCAodGhpcy5fcGFyc2VTdGFjay5zdGF0ZSkge1xuICAgICAgICAgIGNhc2UgUGFyc2VyU3RhY2tUeXBlLkNTSTpcbiAgICAgICAgICAgIGlmIChwcm9taXNlUmVzdWx0ID09PSBmYWxzZSAmJiBoYW5kbGVyUG9zID4gLTEpIHtcbiAgICAgICAgICAgICAgZm9yICg7IGhhbmRsZXJQb3MgPj0gMDsgaGFuZGxlclBvcy0tKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IChoYW5kbGVycyBhcyBDc2lIYW5kbGVyVHlwZVtdKVtoYW5kbGVyUG9zXSh0aGlzLl9wYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJQb3MgPSBoYW5kbGVyUG9zO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9wYXJzZVN0YWNrLmhhbmRsZXJzID0gW107XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFBhcnNlclN0YWNrVHlwZS5FU0M6XG4gICAgICAgICAgICBpZiAocHJvbWlzZVJlc3VsdCA9PT0gZmFsc2UgJiYgaGFuZGxlclBvcyA+IC0xKSB7XG4gICAgICAgICAgICAgIGZvciAoOyBoYW5kbGVyUG9zID49IDA7IGhhbmRsZXJQb3MtLSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSAoaGFuZGxlcnMgYXMgRXNjSGFuZGxlclR5cGVbXSlbaGFuZGxlclBvc10oKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVyUG9zID0gaGFuZGxlclBvcztcbiAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyUmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcGFyc2VTdGFjay5oYW5kbGVycyA9IFtdO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBQYXJzZXJTdGFja1R5cGUuRENTOlxuICAgICAgICAgICAgY29kZSA9IGRhdGFbdGhpcy5fcGFyc2VTdGFjay5jaHVua1Bvc107XG4gICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gdGhpcy5fZGNzUGFyc2VyLnVuaG9vayhjb2RlICE9PSAweDE4ICYmIGNvZGUgIT09IDB4MWEsIHByb21pc2VSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgxYikgdGhpcy5fcGFyc2VTdGFjay50cmFuc2l0aW9uIHw9IFBhcnNlclN0YXRlLkVTQ0FQRTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAvLyBaRE1cbiAgICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBQYXJzZXJTdGFja1R5cGUuT1NDOlxuICAgICAgICAgICAgY29kZSA9IGRhdGFbdGhpcy5fcGFyc2VTdGFjay5jaHVua1Bvc107XG4gICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gdGhpcy5fb3NjUGFyc2VyLmVuZChjb2RlICE9PSAweDE4ICYmIGNvZGUgIT09IDB4MWEsIHByb21pc2VSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gMHgxYikgdGhpcy5fcGFyc2VTdGFjay50cmFuc2l0aW9uIHw9IFBhcnNlclN0YXRlLkVTQ0FQRTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5fcGFyYW1zLmFkZFBhcmFtKDApOyAvLyBaRE1cbiAgICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2xlYW51cCBiZWZvcmUgY29udGludWluZyB3aXRoIHRoZSBtYWluIHN5bmMgbG9vcFxuICAgICAgICB0aGlzLl9wYXJzZVN0YWNrLnN0YXRlID0gUGFyc2VyU3RhY2tUeXBlLk5PTkU7XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5fcGFyc2VTdGFjay5jaHVua1BvcyArIDE7XG4gICAgICAgIHRoaXMucHJlY2VkaW5nSm9pblN0YXRlID0gMDtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLl9wYXJzZVN0YWNrLnRyYW5zaXRpb24gJiBUYWJsZUFjY2Vzcy5UUkFOU0lUSU9OX1NUQVRFX01BU0s7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29udGludWUgd2l0aCBtYWluIHN5bmMgbG9vcFxuXG4gICAgLy8gcHJvY2VzcyBpbnB1dCBzdHJpbmdcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgY29kZSA9IGRhdGFbaV07XG5cbiAgICAgIC8vIG5vcm1hbCB0cmFuc2l0aW9uICYgYWN0aW9uIGxvb2t1cFxuICAgICAgdHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zaXRpb25zLnRhYmxlW3RoaXMuY3VycmVudFN0YXRlIDw8IFRhYmxlQWNjZXNzLklOREVYX1NUQVRFX1NISUZUIHwgKGNvZGUgPCAweGEwID8gY29kZSA6IE5PTl9BU0NJSV9QUklOVEFCTEUpXTtcbiAgICAgIHN3aXRjaCAodHJhbnNpdGlvbiA+PiBUYWJsZUFjY2Vzcy5UUkFOU0lUSU9OX0FDVElPTl9TSElGVCkge1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5QUklOVDpcbiAgICAgICAgICAvLyByZWFkIGFoZWFkIHdpdGggbG9vcCB1bnJvbGxpbmdcbiAgICAgICAgICAvLyBOb3RlOiAweDIwIChTUCkgaXMgaW5jbHVkZWQsIDB4N0YgKERFTCkgaXMgZXhjbHVkZWRcbiAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IDsgKytqKSB7XG4gICAgICAgICAgICBpZiAoaiA+PSBsZW5ndGggfHwgKGNvZGUgPSBkYXRhW2pdKSA8IDB4MjAgfHwgKGNvZGUgPiAweDdlICYmIGNvZGUgPCBOT05fQVNDSUlfUFJJTlRBQkxFKSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcmludEhhbmRsZXIoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKytqID49IGxlbmd0aCB8fCAoY29kZSA9IGRhdGFbal0pIDwgMHgyMCB8fCAoY29kZSA+IDB4N2UgJiYgY29kZSA8IE5PTl9BU0NJSV9QUklOVEFCTEUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3ByaW50SGFuZGxlcihkYXRhLCBpLCBqKTtcbiAgICAgICAgICAgICAgaSA9IGogLSAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgrK2ogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPCAweDIwIHx8IChjb2RlID4gMHg3ZSAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJpbnRIYW5kbGVyKGRhdGEsIGksIGopO1xuICAgICAgICAgICAgICBpID0gaiAtIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCsraiA+PSBsZW5ndGggfHwgKGNvZGUgPSBkYXRhW2pdKSA8IDB4MjAgfHwgKGNvZGUgPiAweDdlICYmIGNvZGUgPCBOT05fQVNDSUlfUFJJTlRBQkxFKSkge1xuICAgICAgICAgICAgICB0aGlzLl9wcmludEhhbmRsZXIoZGF0YSwgaSwgaik7XG4gICAgICAgICAgICAgIGkgPSBqIC0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5FWEVDVVRFOlxuICAgICAgICAgIGlmICh0aGlzLl9leGVjdXRlSGFuZGxlcnNbY29kZV0pIHRoaXMuX2V4ZWN1dGVIYW5kbGVyc1tjb2RlXSgpO1xuICAgICAgICAgIGVsc2UgdGhpcy5fZXhlY3V0ZUhhbmRsZXJGYihjb2RlKTtcbiAgICAgICAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLklHTk9SRTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uRVJST1I6XG4gICAgICAgICAgY29uc3QgaW5qZWN0OiBJUGFyc2luZ1N0YXRlID0gdGhpcy5fZXJyb3JIYW5kbGVyKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwb3NpdGlvbjogaSxcbiAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgY3VycmVudFN0YXRlOiB0aGlzLmN1cnJlbnRTdGF0ZSxcbiAgICAgICAgICAgICAgY29sbGVjdDogdGhpcy5fY29sbGVjdCxcbiAgICAgICAgICAgICAgcGFyYW1zOiB0aGlzLl9wYXJhbXMsXG4gICAgICAgICAgICAgIGFib3J0OiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGluamVjdC5hYm9ydCkgcmV0dXJuO1xuICAgICAgICAgIC8vIGluamVjdCB2YWx1ZXM6IGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWRcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQYXJzZXJBY3Rpb24uQ1NJX0RJU1BBVENIOlxuICAgICAgICAgIC8vIFRyaWdnZXIgQ1NJIEhhbmRsZXJcbiAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2NzaUhhbmRsZXJzW3RoaXMuX2NvbGxlY3QgPDwgOCB8IGNvZGVdO1xuICAgICAgICAgIGxldCBqID0gaGFuZGxlcnMgPyBoYW5kbGVycy5sZW5ndGggLSAxIDogLTE7XG4gICAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgICAvLyB0cnVlIG1lYW5zIHN1Y2Nlc3MgYW5kIHRvIHN0b3AgYnViYmxpbmdcbiAgICAgICAgICAgIC8vIGEgcHJvbWlzZSBpbmRpY2F0ZXMgYW4gYXN5bmMgaGFuZGxlciB0aGF0IG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgcHJvZ3Jlc3NpbmdcbiAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSBoYW5kbGVyc1tqXSh0aGlzLl9wYXJhbXMpO1xuICAgICAgICAgICAgaWYgKGhhbmRsZXJSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXJSZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3ByZXNlcnZlU3RhY2soUGFyc2VyU3RhY2tUeXBlLkNTSSwgaGFuZGxlcnMsIGosIHRyYW5zaXRpb24sIGkpO1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGogPCAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jc2lIYW5kbGVyRmIodGhpcy5fY29sbGVjdCA8PCA4IHwgY29kZSwgdGhpcy5fcGFyYW1zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5QQVJBTTpcbiAgICAgICAgICAvLyBpbm5lciBsb29wOiBkaWdpdHMgKDB4MzAgLSAweDM5KSBhbmQgOyAoMHgzYikgYW5kIDogKDB4M2EpXG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgICAgICAgIGNhc2UgMHgzYjpcbiAgICAgICAgICAgICAgICB0aGlzLl9wYXJhbXMuYWRkUGFyYW0oMCk7ICAvLyBaRE1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAweDNhOlxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRTdWJQYXJhbSgtMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyAweDMwIC0gMHgzOVxuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGREaWdpdChjb2RlIC0gNDgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gd2hpbGUgKCsraSA8IGxlbmd0aCAmJiAoY29kZSA9IGRhdGFbaV0pID4gMHgyZiAmJiBjb2RlIDwgMHgzYyk7XG4gICAgICAgICAgaS0tO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5DT0xMRUNUOlxuICAgICAgICAgIHRoaXMuX2NvbGxlY3QgPDw9IDg7XG4gICAgICAgICAgdGhpcy5fY29sbGVjdCB8PSBjb2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5FU0NfRElTUEFUQ0g6XG4gICAgICAgICAgY29uc3QgaGFuZGxlcnNFc2MgPSB0aGlzLl9lc2NIYW5kbGVyc1t0aGlzLl9jb2xsZWN0IDw8IDggfCBjb2RlXTtcbiAgICAgICAgICBsZXQgamogPSBoYW5kbGVyc0VzYyA/IGhhbmRsZXJzRXNjLmxlbmd0aCAtIDEgOiAtMTtcbiAgICAgICAgICBmb3IgKDsgamogPj0gMDsgamotLSkge1xuICAgICAgICAgICAgLy8gdHJ1ZSBtZWFucyBzdWNjZXNzIGFuZCB0byBzdG9wIGJ1YmJsaW5nXG4gICAgICAgICAgICAvLyBhIHByb21pc2UgaW5kaWNhdGVzIGFuIGFzeW5jIGhhbmRsZXIgdGhhdCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHByb2dyZXNzaW5nXG4gICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gaGFuZGxlcnNFc2NbampdKCk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcHJlc2VydmVTdGFjayhQYXJzZXJTdGFja1R5cGUuRVNDLCBoYW5kbGVyc0VzYywgamosIHRyYW5zaXRpb24sIGkpO1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGpqIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fZXNjSGFuZGxlckZiKHRoaXMuX2NvbGxlY3QgPDwgOCB8IGNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnByZWNlZGluZ0pvaW5TdGF0ZSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkNMRUFSOlxuICAgICAgICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgdGhpcy5fY29sbGVjdCA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkRDU19IT09LOlxuICAgICAgICAgIHRoaXMuX2Rjc1BhcnNlci5ob29rKHRoaXMuX2NvbGxlY3QgPDwgOCB8IGNvZGUsIHRoaXMuX3BhcmFtcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkRDU19QVVQ6XG4gICAgICAgICAgLy8gaW5uZXIgbG9vcCAtIGV4aXQgRENTX1BVVDogMHgxOCwgMHgxYSwgMHgxYiwgMHg3ZiwgMHg4MCAtIDB4OWZcbiAgICAgICAgICAvLyB1bmhvb2sgdHJpZ2dlcmVkIGJ5OiAweDFiLCAweDljIChzdWNjZXNzKSBhbmQgMHgxOCwgMHgxYSAoYWJvcnQpXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyA7ICsraikge1xuICAgICAgICAgICAgaWYgKGogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPT09IDB4MTggfHwgY29kZSA9PT0gMHgxYSB8fCBjb2RlID09PSAweDFiIHx8IChjb2RlID4gMHg3ZiAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZGNzUGFyc2VyLnB1dChkYXRhLCBpLCBqKTtcbiAgICAgICAgICAgICAgaSA9IGogLSAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLkRDU19VTkhPT0s6XG4gICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2Rjc1BhcnNlci51bmhvb2soY29kZSAhPT0gMHgxOCAmJiBjb2RlICE9PSAweDFhKTtcbiAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fcHJlc2VydmVTdGFjayhQYXJzZXJTdGFja1R5cGUuRENTLCBbXSwgMCwgdHJhbnNpdGlvbiwgaSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDB4MWIpIHRyYW5zaXRpb24gfD0gUGFyc2VyU3RhdGUuRVNDQVBFO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgdGhpcy5fY29sbGVjdCA9IDA7XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFBhcnNlckFjdGlvbi5PU0NfU1RBUlQ6XG4gICAgICAgICAgdGhpcy5fb3NjUGFyc2VyLnN0YXJ0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLk9TQ19QVVQ6XG4gICAgICAgICAgLy8gaW5uZXIgbG9vcDogMHgyMCAoU1ApIGluY2x1ZGVkLCAweDdGIChERUwpIGluY2x1ZGVkXG4gICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyA7IGorKykge1xuICAgICAgICAgICAgaWYgKGogPj0gbGVuZ3RoIHx8IChjb2RlID0gZGF0YVtqXSkgPCAweDIwIHx8IChjb2RlID4gMHg3ZiAmJiBjb2RlIDwgTk9OX0FTQ0lJX1BSSU5UQUJMRSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fb3NjUGFyc2VyLnB1dChkYXRhLCBpLCBqKTtcbiAgICAgICAgICAgICAgaSA9IGogLSAxO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUGFyc2VyQWN0aW9uLk9TQ19FTkQ6XG4gICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX29zY1BhcnNlci5lbmQoY29kZSAhPT0gMHgxOCAmJiBjb2RlICE9PSAweDFhKTtcbiAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fcHJlc2VydmVTdGFjayhQYXJzZXJTdGFja1R5cGUuT1NDLCBbXSwgMCwgdHJhbnNpdGlvbiwgaSk7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDB4MWIpIHRyYW5zaXRpb24gfD0gUGFyc2VyU3RhdGUuRVNDQVBFO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcy5yZXNldCgpO1xuICAgICAgICAgIHRoaXMuX3BhcmFtcy5hZGRQYXJhbSgwKTsgLy8gWkRNXG4gICAgICAgICAgdGhpcy5fY29sbGVjdCA9IDA7XG4gICAgICAgICAgdGhpcy5wcmVjZWRpbmdKb2luU3RhdGUgPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0cmFuc2l0aW9uICYgVGFibGVBY2Nlc3MuVFJBTlNJVElPTl9TVEFURV9NQVNLO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJT3NjSGFuZGxlciwgSUhhbmRsZXJDb2xsZWN0aW9uLCBPc2NGYWxsYmFja0hhbmRsZXJUeXBlLCBJT3NjUGFyc2VyLCBJU3ViUGFyc2VyU3RhY2tTdGF0ZSB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvVHlwZXMnO1xuaW1wb3J0IHsgT3NjU3RhdGUsIFBBWUxPQURfTElNSVQgfSBmcm9tICdjb21tb24vcGFyc2VyL0NvbnN0YW50cyc7XG5pbXBvcnQgeyB1dGYzMlRvU3RyaW5nIH0gZnJvbSAnY29tbW9uL2lucHV0L1RleHREZWNvZGVyJztcbmltcG9ydCB7IElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuY29uc3QgRU1QVFlfSEFORExFUlM6IElPc2NIYW5kbGVyW10gPSBbXTtcblxuZXhwb3J0IGNsYXNzIE9zY1BhcnNlciBpbXBsZW1lbnRzIElPc2NQYXJzZXIge1xuICBwcml2YXRlIF9zdGF0ZSA9IE9zY1N0YXRlLlNUQVJUO1xuICBwcml2YXRlIF9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgcHJpdmF0ZSBfaWQgPSAtMTtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IElIYW5kbGVyQ29sbGVjdGlvbjxJT3NjSGFuZGxlcj4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwcml2YXRlIF9oYW5kbGVyRmI6IE9zY0ZhbGxiYWNrSGFuZGxlclR5cGUgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgX3N0YWNrOiBJU3ViUGFyc2VyU3RhY2tTdGF0ZSA9IHtcbiAgICBwYXVzZWQ6IGZhbHNlLFxuICAgIGxvb3BQb3NpdGlvbjogMCxcbiAgICBmYWxsVGhyb3VnaDogZmFsc2VcbiAgfTtcblxuICBwdWJsaWMgcmVnaXN0ZXJIYW5kbGVyKGlkZW50OiBudW1iZXIsIGhhbmRsZXI6IElPc2NIYW5kbGVyKTogSURpc3Bvc2FibGUge1xuICAgIGlmICh0aGlzLl9oYW5kbGVyc1tpZGVudF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5faGFuZGxlcnNbaWRlbnRdID0gW107XG4gICAgfVxuICAgIGNvbnN0IGhhbmRsZXJMaXN0ID0gdGhpcy5faGFuZGxlcnNbaWRlbnRdO1xuICAgIGhhbmRsZXJMaXN0LnB1c2goaGFuZGxlcik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZGV4ID0gaGFuZGxlckxpc3QuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgaWYgKGhhbmRsZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBoYW5kbGVyTGlzdC5zcGxpY2UoaGFuZGxlckluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcHVibGljIGNsZWFySGFuZGxlcihpZGVudDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2hhbmRsZXJzW2lkZW50XSkgZGVsZXRlIHRoaXMuX2hhbmRsZXJzW2lkZW50XTtcbiAgfVxuICBwdWJsaWMgc2V0SGFuZGxlckZhbGxiYWNrKGhhbmRsZXI6IE9zY0ZhbGxiYWNrSGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl9oYW5kbGVyRmIgPSBoYW5kbGVyO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRoaXMuX2hhbmRsZXJGYiA9ICgpID0+IHsgfTtcbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICAvLyBmb3JjZSBjbGVhbnVwIGhhbmRsZXJzIGlmIHBheWxvYWQgd2FzIGFscmVhZHkgc2VudFxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gT3NjU3RhdGUuUEFZTE9BRCkge1xuICAgICAgZm9yIChsZXQgaiA9IHRoaXMuX3N0YWNrLnBhdXNlZCA/IHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiAtIDEgOiB0aGlzLl9hY3RpdmUubGVuZ3RoIC0gMTsgaiA+PSAwOyAtLWopIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2pdLmVuZChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0YWNrLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FjdGl2ZSA9IEVNUFRZX0hBTkRMRVJTO1xuICAgIHRoaXMuX2lkID0gLTE7XG4gICAgdGhpcy5fc3RhdGUgPSBPc2NTdGF0ZS5TVEFSVDtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2hhbmRsZXJzW3RoaXMuX2lkXSB8fCBFTVBUWV9IQU5ETEVSUztcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2hhbmRsZXJGYih0aGlzLl9pZCwgJ1NUQVJUJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGogPSB0aGlzLl9hY3RpdmUubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2pdLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHV0KGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fYWN0aXZlLmxlbmd0aCkge1xuICAgICAgdGhpcy5faGFuZGxlckZiKHRoaXMuX2lkLCAnUFVUJywgdXRmMzJUb1N0cmluZyhkYXRhLCBzdGFydCwgZW5kKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGogPSB0aGlzLl9hY3RpdmUubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlW2pdLnB1dChkYXRhLCBzdGFydCwgZW5kKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gYWx3YXlzIHJlc2V0IGxlZnRvdmVyIGhhbmRsZXJzXG4gICAgdGhpcy5yZXNldCgpO1xuICAgIHRoaXMuX3N0YXRlID0gT3NjU3RhdGUuSUQ7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGRhdGEgdG8gY3VycmVudCBPU0MgY29tbWFuZC5cbiAgICogRXhwZWN0cyB0aGUgaWRlbnRpZmllciBvZiB0aGUgT1NDIGNvbW1hbmQgaW4gdGhlIGZvcm1cbiAgICogT1NDIGlkIDsgcGF5bG9hZCBTVC9CRUxcbiAgICogUGF5bG9hZCBjaHVua3MgYXJlIG5vdCBmdXJ0aGVyIHByb2Nlc3NlZCBhbmQgZ2V0XG4gICAqIGRpcmVjdGx5IHBhc3NlZCB0byB0aGUgaGFuZGxlcnMuXG4gICAqL1xuICBwdWJsaWMgcHV0KGRhdGE6IFVpbnQzMkFycmF5LCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gT3NjU3RhdGUuQUJPUlQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBPc2NTdGF0ZS5JRCkge1xuICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBkYXRhW3N0YXJ0KytdO1xuICAgICAgICBpZiAoY29kZSA9PT0gMHgzYikge1xuICAgICAgICAgIHRoaXMuX3N0YXRlID0gT3NjU3RhdGUuUEFZTE9BRDtcbiAgICAgICAgICB0aGlzLl9zdGFydCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlIDwgMHgzMCB8fCAweDM5IDwgY29kZSkge1xuICAgICAgICAgIHRoaXMuX3N0YXRlID0gT3NjU3RhdGUuQUJPUlQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pZCA9PT0gLTEpIHtcbiAgICAgICAgICB0aGlzLl9pZCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faWQgPSB0aGlzLl9pZCAqIDEwICsgY29kZSAtIDQ4O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IE9zY1N0YXRlLlBBWUxPQUQgJiYgZW5kIC0gc3RhcnQgPiAwKSB7XG4gICAgICB0aGlzLl9wdXQoZGF0YSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBlbmQgb2YgYW4gT1NDIGNvbW1hbmQuXG4gICAqIFdoZXRoZXIgdGhlIE9TQyBnb3QgYWJvcnRlZCBvciBmaW5pc2hlZCBub3JtYWxseVxuICAgKiBpcyBpbmRpY2F0ZWQgYnkgYHN1Y2Nlc3NgLlxuICAgKi9cbiAgcHVibGljIGVuZChzdWNjZXNzOiBib29sZWFuLCBwcm9taXNlUmVzdWx0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQgfCBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IE9zY1N0YXRlLlNUQVJUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGRvIG5vdGhpbmcgaWYgY29tbWFuZCB3YXMgZmF1bHR5XG4gICAgaWYgKHRoaXMuX3N0YXRlICE9PSBPc2NTdGF0ZS5BQk9SVCkge1xuICAgICAgLy8gaWYgd2UgYXJlIHN0aWxsIGluIElEIHN0YXRlIGFuZCBnZXQgYW4gZWFybHkgZW5kXG4gICAgICAvLyBtZWFucyB0aGF0IHRoZSBjb21tYW5kIGhhcyBubyBwYXlsb2FkIHRodXMgd2Ugc3RpbGwgaGF2ZVxuICAgICAgLy8gdG8gYW5ub3VuY2UgU1RBUlQgYW5kIHNlbmQgRU5EIHJpZ2h0IGFmdGVyXG4gICAgICBpZiAodGhpcy5fc3RhdGUgPT09IE9zY1N0YXRlLklEKSB7XG4gICAgICAgIHRoaXMuX3N0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5fYWN0aXZlLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVyRmIodGhpcy5faWQsICdFTkQnLCBzdWNjZXNzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBoYW5kbGVyUmVzdWx0OiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiA9IGZhbHNlO1xuICAgICAgICBsZXQgaiA9IHRoaXMuX2FjdGl2ZS5sZW5ndGggLSAxO1xuICAgICAgICBsZXQgZmFsbFRocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX3N0YWNrLnBhdXNlZCkge1xuICAgICAgICAgIGogPSB0aGlzLl9zdGFjay5sb29wUG9zaXRpb24gLSAxO1xuICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSBwcm9taXNlUmVzdWx0O1xuICAgICAgICAgIGZhbGxUaHJvdWdoID0gdGhpcy5fc3RhY2suZmFsbFRocm91Z2g7XG4gICAgICAgICAgdGhpcy5fc3RhY2sucGF1c2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmYWxsVGhyb3VnaCAmJiBoYW5kbGVyUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgIGZvciAoOyBqID49IDA7IGotLSkge1xuICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2FjdGl2ZVtqXS5lbmQoc3VjY2Vzcyk7XG4gICAgICAgICAgICBpZiAoaGFuZGxlclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlclJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgdGhpcy5fc3RhY2sucGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdGhpcy5fc3RhY2subG9vcFBvc2l0aW9uID0gajtcbiAgICAgICAgICAgICAgdGhpcy5fc3RhY2suZmFsbFRocm91Z2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGotLTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhbnVwIGxlZnQgb3ZlciBoYW5kbGVyc1xuICAgICAgICAvLyB3ZSBhbHdheXMgaGF2ZSB0byBjYWxsIC5lbmQgZm9yIHByb3BlciBjbGVhbnVwLFxuICAgICAgICAvLyBoZXJlIHdlIHVzZSBgc3VjY2Vzc2AgdG8gaW5kaWNhdGUgd2hldGhlciBhIGhhbmRsZXIgc2hvdWxkIGV4ZWN1dGVcbiAgICAgICAgZm9yICg7IGogPj0gMDsgai0tKSB7XG4gICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHRoaXMuX2FjdGl2ZVtqXS5lbmQoZmFsc2UpO1xuICAgICAgICAgIGlmIChoYW5kbGVyUmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5fc3RhY2sucGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX3N0YWNrLmxvb3BQb3NpdGlvbiA9IGo7XG4gICAgICAgICAgICB0aGlzLl9zdGFjay5mYWxsVGhyb3VnaCA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH1cbiAgICB0aGlzLl9hY3RpdmUgPSBFTVBUWV9IQU5ETEVSUztcbiAgICB0aGlzLl9pZCA9IC0xO1xuICAgIHRoaXMuX3N0YXRlID0gT3NjU3RhdGUuU1RBUlQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZW5pZW50IGNsYXNzIHRvIGFsbG93IGF0dGFjaGluZyBzdHJpbmcgYmFzZWQgaGFuZGxlciBmdW5jdGlvbnNcbiAqIGFzIE9TQyBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE9zY0hhbmRsZXIgaW1wbGVtZW50cyBJT3NjSGFuZGxlciB7XG4gIHByaXZhdGUgX2RhdGEgPSAnJztcbiAgcHJpdmF0ZSBfaGl0TGltaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oYW5kbGVyOiAoZGF0YTogc3RyaW5nKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgeyB9XG5cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHB1dChkYXRhOiBVaW50MzJBcnJheSwgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZGF0YSArPSB1dGYzMlRvU3RyaW5nKGRhdGEsIHN0YXJ0LCBlbmQpO1xuICAgIGlmICh0aGlzLl9kYXRhLmxlbmd0aCA+IFBBWUxPQURfTElNSVQpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICAgIHRoaXMuX2hpdExpbWl0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZW5kKHN1Y2Nlc3M6IGJvb2xlYW4pOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbGV0IHJldDogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy5faGl0TGltaXQpIHtcbiAgICAgIHJldCA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoc3VjY2Vzcykge1xuICAgICAgcmV0ID0gdGhpcy5faGFuZGxlcih0aGlzLl9kYXRhKTtcbiAgICAgIGlmIChyZXQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIG5lZWQgdG8gaG9sZCBkYXRhIHVudGlsIGByZXRgIGdvdCByZXNvbHZlZFxuICAgICAgICAvLyBkb250IGNhcmUgZm9yIGVycm9ycywgZGF0YSB3aWxsIGJlIGZyZWVkIGFueXdheSBvbiBuZXh0IHN0YXJ0XG4gICAgICAgIHJldHVybiByZXQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIHRoaXMuX2RhdGEgPSAnJztcbiAgICAgICAgICB0aGlzLl9oaXRMaW1pdCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9kYXRhID0gJyc7XG4gICAgdGhpcy5faGl0TGltaXQgPSBmYWxzZTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5pbXBvcnQgeyBJUGFyYW1zLCBQYXJhbXNBcnJheSB9IGZyb20gJ2NvbW1vbi9wYXJzZXIvVHlwZXMnO1xuXG4vLyBtYXggdmFsdWUgc3VwcG9ydGVkIGZvciBhIHNpbmdsZSBwYXJhbS9zdWJwYXJhbSAoY2xhbXBlZCB0byBwb3NpdGl2ZSBpbnQzMiByYW5nZSlcbmNvbnN0IE1BWF9WQUxVRSA9IDB4N0ZGRkZGRkY7XG4vLyBtYXggYWxsb3dlZCBzdWJwYXJhbXMgZm9yIGEgc2luZ2xlIHNlcXVlbmNlIChoYXJkY29kZWQgbGltaXRhdGlvbilcbmNvbnN0IE1BWF9TVUJQQVJBTVMgPSAyNTY7XG5cbi8qKlxuICogUGFyYW1zIHN0b3JhZ2UgY2xhc3MuXG4gKiBUaGlzIHR5cGUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGFjY3VtdWxhdGUgc2VxdWVuY2UgcGFyYW1ldGVycyBhbmQgc3ViIHBhcmFtZXRlcnNcbiAqIGFuZCB0cmFuc21pdCB0aGVtIHRvIHRoZSBpbnB1dCBoYW5kbGVyIGFjdGlvbnMuXG4gKlxuICogTk9URVM6XG4gKiAgLSBwYXJhbXMgb2JqZWN0IGZvciBhY3Rpb24gaGFuZGxlcnMgaXMgYm9ycm93ZWQsIHVzZSBgLnRvQXJyYXlgIG9yIGAuY2xvbmVgIHRvIGdldCBhIGNvcHlcbiAqICAtIG5ldmVyIHJlYWQgYmV5b25kIGBwYXJhbXMubGVuZ3RoIC0gMWAgKGxpa2VseSB0byBjb250YWluIGFyYml0cmFyeSBkYXRhKVxuICogIC0gYC5nZXRTdWJQYXJhbXNgIHJldHVybnMgYSBib3Jyb3dlZCB0eXBlZCBhcnJheSwgdXNlIGAuZ2V0U3ViUGFyYW1zQWxsYCBmb3IgY2xvbmVkIHN1YiBwYXJhbXNcbiAqICAtIGhhcmRjb2RlZCBsaW1pdGF0aW9uczpcbiAqICAgIC0gbWF4LiB2YWx1ZSBmb3IgYSBzaW5nbGUgKHN1YikgcGFyYW0gaXMgMl4zMSAtIDEgKGdyZWF0ZXIgdmFsdWVzIGFyZSBjbGFtcGVkIHRvIHRoYXQpXG4gKiAgICAtIG1heC4gMjU2IHN1YiBwYXJhbXMgcG9zc2libGVcbiAqICAgIC0gbmVnYXRpdmUgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCBiZXNpZGUgLTEgKHBsYWNlaG9sZGVyIGZvciBkZWZhdWx0IHZhbHVlKVxuICpcbiAqIEFib3V0IFpETSAoWmVybyBEZWZhdWx0IE1vZGUpOlxuICogWkRNIGlzIG5vdCBvcmNoZXN0cmF0ZWQgYnkgdGhpcyBjbGFzcy4gSWYgdGhlIHBhcnNlciBpcyBpbiBaRE0sXG4gKiBpdCBzaG91bGQgYWRkIDAgZm9yIGVtcHR5IHBhcmFtcywgb3RoZXJ3aXNlIC0xLiBUaGlzIGRvZXMgbm90IGFwcGx5XG4gKiB0byBzdWJwYXJhbXMsIGVtcHR5IHN1YnBhcmFtcyBzaG91bGQgYWx3YXlzIGJlIGFkZGVkIHdpdGggLTEuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJhbXMgaW1wbGVtZW50cyBJUGFyYW1zIHtcbiAgLy8gcGFyYW1zIHN0b3JlIGFuZCBsZW5ndGhcbiAgcHVibGljIHBhcmFtczogSW50MzJBcnJheTtcbiAgcHVibGljIGxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIHN1YiBwYXJhbXMgc3RvcmUgYW5kIGxlbmd0aFxuICBwcm90ZWN0ZWQgX3N1YlBhcmFtczogSW50MzJBcnJheTtcbiAgcHJvdGVjdGVkIF9zdWJQYXJhbXNMZW5ndGg6IG51bWJlcjtcblxuICAvLyBzdWIgcGFyYW1zIG9mZnNldHMgZnJvbSBwYXJhbTogcGFyYW0gaWR4IC0tPiBbc3RhcnQsIGVuZF0gb2Zmc2V0XG4gIHByaXZhdGUgX3N1YlBhcmFtc0lkeDogVWludDE2QXJyYXk7XG4gIHByaXZhdGUgX3JlamVjdERpZ2l0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcmVqZWN0U3ViRGlnaXRzOiBib29sZWFuO1xuICBwcml2YXRlIF9kaWdpdElzU3ViOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBgUGFyYW1zYCB0eXBlIGZyb20gSlMgYXJyYXkgcmVwcmVzZW50YXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcnJheSh2YWx1ZXM6IFBhcmFtc0FycmF5KTogUGFyYW1zIHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgUGFyYW1zKCk7XG4gICAgaWYgKCF2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cbiAgICAvLyBza2lwIGxlYWRpbmcgc3ViIHBhcmFtc1xuICAgIGZvciAobGV0IGkgPSAoQXJyYXkuaXNBcnJheSh2YWx1ZXNbMF0pKSA/IDEgOiAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHZhbHVlLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgcGFyYW1zLmFkZFN1YlBhcmFtKHZhbHVlW2tdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1zLmFkZFBhcmFtKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWF4TGVuZ3RoIG1heCBsZW5ndGggb2Ygc3RvcmFibGUgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gbWF4U3ViUGFyYW1zTGVuZ3RoIG1heCBsZW5ndGggb2Ygc3RvcmFibGUgc3ViIHBhcmFtZXRlcnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtYXhMZW5ndGg6IG51bWJlciA9IDMyLCBwdWJsaWMgbWF4U3ViUGFyYW1zTGVuZ3RoOiBudW1iZXIgPSAzMikge1xuICAgIGlmIChtYXhTdWJQYXJhbXNMZW5ndGggPiBNQVhfU1VCUEFSQU1TKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFN1YlBhcmFtc0xlbmd0aCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gMjU2Jyk7XG4gICAgfVxuICAgIHRoaXMucGFyYW1zID0gbmV3IEludDMyQXJyYXkobWF4TGVuZ3RoKTtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5fc3ViUGFyYW1zID0gbmV3IEludDMyQXJyYXkobWF4U3ViUGFyYW1zTGVuZ3RoKTtcbiAgICB0aGlzLl9zdWJQYXJhbXNMZW5ndGggPSAwO1xuICAgIHRoaXMuX3N1YlBhcmFtc0lkeCA9IG5ldyBVaW50MTZBcnJheShtYXhMZW5ndGgpO1xuICAgIHRoaXMuX3JlamVjdERpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlamVjdFN1YkRpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX2RpZ2l0SXNTdWIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSBvYmplY3QuXG4gICAqL1xuICBwdWJsaWMgY2xvbmUoKTogUGFyYW1zIHtcbiAgICBjb25zdCBuZXdQYXJhbXMgPSBuZXcgUGFyYW1zKHRoaXMubWF4TGVuZ3RoLCB0aGlzLm1heFN1YlBhcmFtc0xlbmd0aCk7XG4gICAgbmV3UGFyYW1zLnBhcmFtcy5zZXQodGhpcy5wYXJhbXMpO1xuICAgIG5ld1BhcmFtcy5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBuZXdQYXJhbXMuX3N1YlBhcmFtcy5zZXQodGhpcy5fc3ViUGFyYW1zKTtcbiAgICBuZXdQYXJhbXMuX3N1YlBhcmFtc0xlbmd0aCA9IHRoaXMuX3N1YlBhcmFtc0xlbmd0aDtcbiAgICBuZXdQYXJhbXMuX3N1YlBhcmFtc0lkeC5zZXQodGhpcy5fc3ViUGFyYW1zSWR4KTtcbiAgICBuZXdQYXJhbXMuX3JlamVjdERpZ2l0cyA9IHRoaXMuX3JlamVjdERpZ2l0cztcbiAgICBuZXdQYXJhbXMuX3JlamVjdFN1YkRpZ2l0cyA9IHRoaXMuX3JlamVjdFN1YkRpZ2l0cztcbiAgICBuZXdQYXJhbXMuX2RpZ2l0SXNTdWIgPSB0aGlzLl9kaWdpdElzU3ViO1xuICAgIHJldHVybiBuZXdQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgSlMgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyBhbmQgc3ViIHBhcmFtZXRlcnMuXG4gICAqIFRoZSBhcnJheSBpcyBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3M6XG4gICAqICAgIHNlcXVlbmNlOiBcIjE7MjozOjQ7NTo6NlwiXG4gICAqICAgIGFycmF5ICAgOiBbMSwgMiwgWzMsIDRdLCA1LCBbLTEsIDZdXVxuICAgKi9cbiAgcHVibGljIHRvQXJyYXkoKTogUGFyYW1zQXJyYXkge1xuICAgIGNvbnN0IHJlczogUGFyYW1zQXJyYXkgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHJlcy5wdXNoKHRoaXMucGFyYW1zW2ldKTtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5fc3ViUGFyYW1zSWR4W2ldID4+IDg7XG4gICAgICBjb25zdCBlbmQgPSB0aGlzLl9zdWJQYXJhbXNJZHhbaV0gJiAweEZGO1xuICAgICAgaWYgKGVuZCAtIHN0YXJ0ID4gMCkge1xuICAgICAgICByZXMucHVzaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9zdWJQYXJhbXMsIHN0YXJ0LCBlbmQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0byBpbml0aWFsIGVtcHR5IHN0YXRlLlxuICAgKi9cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLl9zdWJQYXJhbXNMZW5ndGggPSAwO1xuICAgIHRoaXMuX3JlamVjdERpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX3JlamVjdFN1YkRpZ2l0cyA9IGZhbHNlO1xuICAgIHRoaXMuX2RpZ2l0SXNTdWIgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJhbWV0ZXIgdmFsdWUuXG4gICAqIGBQYXJhbXNgIG9ubHkgc3RvcmVzIHVwIHRvIGBtYXhMZW5ndGhgIHBhcmFtZXRlcnMsIGFueSBsYXRlclxuICAgKiBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkLlxuICAgKiBOb3RlOiBWVCBkZXZpY2VzIG9ubHkgc3RvcmVkIHVwIHRvIDE2IHZhbHVlcywgeHRlcm0gc2VlbXMgdG9cbiAgICogc3RvcmUgdXAgdG8gMzAuXG4gICAqL1xuICBwdWJsaWMgYWRkUGFyYW0odmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2RpZ2l0SXNTdWIgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGgpIHtcbiAgICAgIHRoaXMuX3JlamVjdERpZ2l0cyA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZSA8IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcyBsZXNzZXIgdGhhbiAtMSBhcmUgbm90IGFsbG93ZWQnKTtcbiAgICB9XG4gICAgdGhpcy5fc3ViUGFyYW1zSWR4W3RoaXMubGVuZ3RoXSA9IHRoaXMuX3N1YlBhcmFtc0xlbmd0aCA8PCA4IHwgdGhpcy5fc3ViUGFyYW1zTGVuZ3RoO1xuICAgIHRoaXMucGFyYW1zW3RoaXMubGVuZ3RoKytdID0gdmFsdWUgPiBNQVhfVkFMVUUgPyBNQVhfVkFMVUUgOiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzdWIgcGFyYW1ldGVyIHZhbHVlLlxuICAgKiBUaGUgc3ViIHBhcmFtZXRlciBpcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGFzdCBwYXJhbWV0ZXIgdmFsdWUuXG4gICAqIFRodXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGFkZCBhIHN1YnBhcmFtZXRlciB3aXRob3V0IGFueSBwYXJhbWV0ZXIgYWRkZWQgeWV0LlxuICAgKiBgUGFyYW1zYCBvbmx5IHN0b3JlcyB1cCB0byBgc3ViUGFyYW1zTGVuZ3RoYCBzdWIgcGFyYW1ldGVycywgYW55IGxhdGVyXG4gICAqIHN1YiBwYXJhbWV0ZXIgd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgcHVibGljIGFkZFN1YlBhcmFtKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9kaWdpdElzU3ViID0gdHJ1ZTtcbiAgICBpZiAoIXRoaXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZWplY3REaWdpdHMgfHwgdGhpcy5fc3ViUGFyYW1zTGVuZ3RoID49IHRoaXMubWF4U3ViUGFyYW1zTGVuZ3RoKSB7XG4gICAgICB0aGlzLl9yZWplY3RTdWJEaWdpdHMgPSB0cnVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPCAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMgbGVzc2VyIHRoYW4gLTEgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgfVxuICAgIHRoaXMuX3N1YlBhcmFtc1t0aGlzLl9zdWJQYXJhbXNMZW5ndGgrK10gPSB2YWx1ZSA+IE1BWF9WQUxVRSA/IE1BWF9WQUxVRSA6IHZhbHVlO1xuICAgIHRoaXMuX3N1YlBhcmFtc0lkeFt0aGlzLmxlbmd0aCAtIDFdKys7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYXJhbWV0ZXIgYXQgaW5kZXggYGlkeGAgaGFzIHN1YiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGhhc1N1YlBhcmFtcyhpZHg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoKHRoaXMuX3N1YlBhcmFtc0lkeFtpZHhdICYgMHhGRikgLSAodGhpcy5fc3ViUGFyYW1zSWR4W2lkeF0gPj4gOCkgPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3ViIHBhcmFtZXRlcnMgZm9yIHBhcmFtZXRlciBhdCBpbmRleCBgaWR4YC5cbiAgICogTm90ZTogVGhlIHZhbHVlcyBhcmUgYm9ycm93ZWQsIHRodXMgeW91IG5lZWQgdG8gY29weVxuICAgKiB0aGUgdmFsdWVzIGlmIHlvdSBuZWVkIHRvIGhvbGQgdGhlbSBpbiBub25sb2NhbCBzY29wZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTdWJQYXJhbXMoaWR4OiBudW1iZXIpOiBJbnQzMkFycmF5IHwgbnVsbCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9zdWJQYXJhbXNJZHhbaWR4XSA+PiA4O1xuICAgIGNvbnN0IGVuZCA9IHRoaXMuX3N1YlBhcmFtc0lkeFtpZHhdICYgMHhGRjtcbiAgICBpZiAoZW5kIC0gc3RhcnQgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3ViUGFyYW1zLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHN1YiBwYXJhbWV0ZXJzIGFzIHtpZHg6IHN1YnBhcmFtc30gbWFwcGluZy5cbiAgICogTm90ZTogVGhlIHZhbHVlcyBhcmUgbm90IGJvcnJvd2VkLlxuICAgKi9cbiAgcHVibGljIGdldFN1YlBhcmFtc0FsbCgpOiB7W2lkeDogbnVtYmVyXTogSW50MzJBcnJheX0ge1xuICAgIGNvbnN0IHJlc3VsdDoge1tpZHg6IG51bWJlcl06IEludDMyQXJyYXl9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBzdGFydCA9IHRoaXMuX3N1YlBhcmFtc0lkeFtpXSA+PiA4O1xuICAgICAgY29uc3QgZW5kID0gdGhpcy5fc3ViUGFyYW1zSWR4W2ldICYgMHhGRjtcbiAgICAgIGlmIChlbmQgLSBzdGFydCA+IDApIHtcbiAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5fc3ViUGFyYW1zLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmdsZSBkaWdpdCB2YWx1ZSB0byBjdXJyZW50IHBhcmFtZXRlci5cbiAgICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gYWNjb3VudCBkaWdpdHMgb24gYSBjaGFyIGJ5IGNoYXIgYmFzaXMuXG4gICAqL1xuICBwdWJsaWMgYWRkRGlnaXQodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBsZW5ndGg7XG4gICAgaWYgKHRoaXMuX3JlamVjdERpZ2l0c1xuICAgICAgfHwgIShsZW5ndGggPSB0aGlzLl9kaWdpdElzU3ViID8gdGhpcy5fc3ViUGFyYW1zTGVuZ3RoIDogdGhpcy5sZW5ndGgpXG4gICAgICB8fCAodGhpcy5fZGlnaXRJc1N1YiAmJiB0aGlzLl9yZWplY3RTdWJEaWdpdHMpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLl9kaWdpdElzU3ViID8gdGhpcy5fc3ViUGFyYW1zIDogdGhpcy5wYXJhbXM7XG4gICAgY29uc3QgY3VyID0gc3RvcmVbbGVuZ3RoIC0gMV07XG4gICAgc3RvcmVbbGVuZ3RoIC0gMV0gPSB+Y3VyID8gTWF0aC5taW4oY3VyICogMTAgKyB2YWx1ZSwgTUFYX1ZBTFVFKSA6IHZhbHVlO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElUZXJtaW5hbEFkZG9uLCBJRGlzcG9zYWJsZSwgVGVybWluYWwgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2FkZWRBZGRvbiB7XG4gIGluc3RhbmNlOiBJVGVybWluYWxBZGRvbjtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbiAgaXNEaXNwb3NlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEFkZG9uTWFuYWdlciBpbXBsZW1lbnRzIElEaXNwb3NhYmxlIHtcbiAgcHJvdGVjdGVkIF9hZGRvbnM6IElMb2FkZWRBZGRvbltdID0gW107XG5cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IHRoaXMuX2FkZG9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5fYWRkb25zW2ldLmluc3RhbmNlLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbG9hZEFkZG9uKHRlcm1pbmFsOiBUZXJtaW5hbCwgaW5zdGFuY2U6IElUZXJtaW5hbEFkZG9uKTogdm9pZCB7XG4gICAgY29uc3QgbG9hZGVkQWRkb246IElMb2FkZWRBZGRvbiA9IHtcbiAgICAgIGluc3RhbmNlLFxuICAgICAgZGlzcG9zZTogaW5zdGFuY2UuZGlzcG9zZSxcbiAgICAgIGlzRGlzcG9zZWQ6IGZhbHNlXG4gICAgfTtcbiAgICB0aGlzLl9hZGRvbnMucHVzaChsb2FkZWRBZGRvbik7XG4gICAgaW5zdGFuY2UuZGlzcG9zZSA9ICgpID0+IHRoaXMuX3dyYXBwZWRBZGRvbkRpc3Bvc2UobG9hZGVkQWRkb24pO1xuICAgIGluc3RhbmNlLmFjdGl2YXRlKHRlcm1pbmFsIGFzIGFueSk7XG4gIH1cblxuICBwcml2YXRlIF93cmFwcGVkQWRkb25EaXNwb3NlKGxvYWRlZEFkZG9uOiBJTG9hZGVkQWRkb24pOiB2b2lkIHtcbiAgICBpZiAobG9hZGVkQWRkb24uaXNEaXNwb3NlZCkge1xuICAgICAgLy8gRG8gbm90aGluZyBpZiBhbHJlYWR5IGRpc3Bvc2VkXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fYWRkb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5fYWRkb25zW2ldID09PSBsb2FkZWRBZGRvbikge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkaXNwb3NlIGFuIGFkZG9uIHRoYXQgaGFzIG5vdCBiZWVuIGxvYWRlZCcpO1xuICAgIH1cbiAgICBsb2FkZWRBZGRvbi5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBsb2FkZWRBZGRvbi5kaXNwb3NlLmFwcGx5KGxvYWRlZEFkZG9uLmluc3RhbmNlKTtcbiAgICB0aGlzLl9hZGRvbnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBJQnVmZmVyIGFzIElCdWZmZXJBcGksIElCdWZmZXJMaW5lIGFzIElCdWZmZXJMaW5lQXBpLCBJQnVmZmVyQ2VsbCBhcyBJQnVmZmVyQ2VsbEFwaSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5pbXBvcnQgeyBJQnVmZmVyIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9UeXBlcyc7XG5pbXBvcnQgeyBCdWZmZXJMaW5lQXBpVmlldyB9IGZyb20gJ2NvbW1vbi9wdWJsaWMvQnVmZmVyTGluZUFwaVZpZXcnO1xuaW1wb3J0IHsgQ2VsbERhdGEgfSBmcm9tICdjb21tb24vYnVmZmVyL0NlbGxEYXRhJztcblxuZXhwb3J0IGNsYXNzIEJ1ZmZlckFwaVZpZXcgaW1wbGVtZW50cyBJQnVmZmVyQXBpIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfYnVmZmVyOiBJQnVmZmVyLFxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiAnbm9ybWFsJyB8ICdhbHRlcm5hdGUnXG4gICkgeyB9XG5cbiAgcHVibGljIGluaXQoYnVmZmVyOiBJQnVmZmVyKTogQnVmZmVyQXBpVmlldyB7XG4gICAgdGhpcy5fYnVmZmVyID0gYnVmZmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJzb3JZKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9idWZmZXIueTsgfVxuICBwdWJsaWMgZ2V0IGN1cnNvclgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2J1ZmZlci54OyB9XG4gIHB1YmxpYyBnZXQgdmlld3BvcnRZKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9idWZmZXIueWRpc3A7IH1cbiAgcHVibGljIGdldCBiYXNlWSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fYnVmZmVyLnliYXNlOyB9XG4gIHB1YmxpYyBnZXQgbGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9idWZmZXIubGluZXMubGVuZ3RoOyB9XG4gIHB1YmxpYyBnZXRMaW5lKHk6IG51bWJlcik6IElCdWZmZXJMaW5lQXBpIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsaW5lID0gdGhpcy5fYnVmZmVyLmxpbmVzLmdldCh5KTtcbiAgICBpZiAoIWxpbmUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQnVmZmVyTGluZUFwaVZpZXcobGluZSk7XG4gIH1cbiAgcHVibGljIGdldE51bGxDZWxsKCk6IElCdWZmZXJDZWxsQXBpIHsgcmV0dXJuIG5ldyBDZWxsRGF0YSgpOyB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IENlbGxEYXRhIH0gZnJvbSAnY29tbW9uL2J1ZmZlci9DZWxsRGF0YSc7XG5pbXBvcnQgeyBJQnVmZmVyTGluZSwgSUNlbGxEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJDZWxsIGFzIElCdWZmZXJDZWxsQXBpLCBJQnVmZmVyTGluZSBhcyBJQnVmZmVyTGluZUFwaSB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmV4cG9ydCBjbGFzcyBCdWZmZXJMaW5lQXBpVmlldyBpbXBsZW1lbnRzIElCdWZmZXJMaW5lQXBpIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbGluZTogSUJ1ZmZlckxpbmUpIHsgfVxuXG4gIHB1YmxpYyBnZXQgaXNXcmFwcGVkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fbGluZS5pc1dyYXBwZWQ7IH1cbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2xpbmUubGVuZ3RoOyB9XG4gIHB1YmxpYyBnZXRDZWxsKHg6IG51bWJlciwgY2VsbD86IElCdWZmZXJDZWxsQXBpKTogSUJ1ZmZlckNlbGxBcGkgfCB1bmRlZmluZWQge1xuICAgIGlmICh4IDwgMCB8fCB4ID49IHRoaXMuX2xpbmUubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChjZWxsKSB7XG4gICAgICB0aGlzLl9saW5lLmxvYWRDZWxsKHgsIGNlbGwgYXMgSUNlbGxEYXRhKTtcbiAgICAgIHJldHVybiBjZWxsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbGluZS5sb2FkQ2VsbCh4LCBuZXcgQ2VsbERhdGEoKSk7XG4gIH1cbiAgcHVibGljIHRyYW5zbGF0ZVRvU3RyaW5nKHRyaW1SaWdodD86IGJvb2xlYW4sIHN0YXJ0Q29sdW1uPzogbnVtYmVyLCBlbmRDb2x1bW4/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9saW5lLnRyYW5zbGF0ZVRvU3RyaW5nKHRyaW1SaWdodCwgc3RhcnRDb2x1bW4sIGVuZENvbHVtbik7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUJ1ZmZlciBhcyBJQnVmZmVyQXBpLCBJQnVmZmVyTmFtZXNwYWNlIGFzIElCdWZmZXJOYW1lc3BhY2VBcGkgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHsgQnVmZmVyQXBpVmlldyB9IGZyb20gJ2NvbW1vbi9wdWJsaWMvQnVmZmVyQXBpVmlldyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IElDb3JlVGVybWluYWwgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuXG5leHBvcnQgY2xhc3MgQnVmZmVyTmFtZXNwYWNlQXBpIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElCdWZmZXJOYW1lc3BhY2VBcGkge1xuICBwcml2YXRlIF9ub3JtYWw6IEJ1ZmZlckFwaVZpZXc7XG4gIHByaXZhdGUgX2FsdGVybmF0ZTogQnVmZmVyQXBpVmlldztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJ1ZmZlckNoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxJQnVmZmVyQXBpPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uQnVmZmVyQ2hhbmdlID0gdGhpcy5fb25CdWZmZXJDaGFuZ2UuZXZlbnQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29yZTogSUNvcmVUZXJtaW5hbCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fbm9ybWFsID0gbmV3IEJ1ZmZlckFwaVZpZXcodGhpcy5fY29yZS5idWZmZXJzLm5vcm1hbCwgJ25vcm1hbCcpO1xuICAgIHRoaXMuX2FsdGVybmF0ZSA9IG5ldyBCdWZmZXJBcGlWaWV3KHRoaXMuX2NvcmUuYnVmZmVycy5hbHQsICdhbHRlcm5hdGUnKTtcbiAgICB0aGlzLl9jb3JlLmJ1ZmZlcnMub25CdWZmZXJBY3RpdmF0ZSgoKSA9PiB0aGlzLl9vbkJ1ZmZlckNoYW5nZS5maXJlKHRoaXMuYWN0aXZlKSk7XG4gIH1cbiAgcHVibGljIGdldCBhY3RpdmUoKTogSUJ1ZmZlckFwaSB7XG4gICAgaWYgKHRoaXMuX2NvcmUuYnVmZmVycy5hY3RpdmUgPT09IHRoaXMuX2NvcmUuYnVmZmVycy5ub3JtYWwpIHsgcmV0dXJuIHRoaXMubm9ybWFsOyB9XG4gICAgaWYgKHRoaXMuX2NvcmUuYnVmZmVycy5hY3RpdmUgPT09IHRoaXMuX2NvcmUuYnVmZmVycy5hbHQpIHsgcmV0dXJuIHRoaXMuYWx0ZXJuYXRlOyB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBY3RpdmUgYnVmZmVyIGlzIG5laXRoZXIgbm9ybWFsIG5vciBhbHRlcm5hdGUnKTtcbiAgfVxuICBwdWJsaWMgZ2V0IG5vcm1hbCgpOiBJQnVmZmVyQXBpIHtcbiAgICByZXR1cm4gdGhpcy5fbm9ybWFsLmluaXQodGhpcy5fY29yZS5idWZmZXJzLm5vcm1hbCk7XG4gIH1cbiAgcHVibGljIGdldCBhbHRlcm5hdGUoKTogSUJ1ZmZlckFwaSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsdGVybmF0ZS5pbml0KHRoaXMuX2NvcmUuYnVmZmVycy5hbHQpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElQYXJhbXMgfSBmcm9tICdjb21tb24vcGFyc2VyL1R5cGVzJztcbmltcG9ydCB7IElEaXNwb3NhYmxlLCBJRnVuY3Rpb25JZGVudGlmaWVyLCBJUGFyc2VyIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7IElDb3JlVGVybWluYWwgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUGFyc2VyQXBpIGltcGxlbWVudHMgSVBhcnNlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvcmU6IElDb3JlVGVybWluYWwpIHsgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNzaUhhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGNhbGxiYWNrOiAocGFyYW1zOiAobnVtYmVyIHwgbnVtYmVyW10pW10pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyQ3NpSGFuZGxlcihpZCwgKHBhcmFtczogSVBhcmFtcykgPT4gY2FsbGJhY2socGFyYW1zLnRvQXJyYXkoKSkpO1xuICB9XG4gIHB1YmxpYyBhZGRDc2lIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKHBhcmFtczogKG51bWJlciB8IG51bWJlcltdKVtdKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik6IElEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlckNzaUhhbmRsZXIoaWQsIGNhbGxiYWNrKTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJEY3NIYW5kbGVyKGlkOiBJRnVuY3Rpb25JZGVudGlmaWVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZywgcGFyYW06IChudW1iZXIgfCBudW1iZXJbXSlbXSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJEY3NIYW5kbGVyKGlkLCAoZGF0YTogc3RyaW5nLCBwYXJhbXM6IElQYXJhbXMpID0+IGNhbGxiYWNrKGRhdGEsIHBhcmFtcy50b0FycmF5KCkpKTtcbiAgfVxuICBwdWJsaWMgYWRkRGNzSGFuZGxlcihpZDogSUZ1bmN0aW9uSWRlbnRpZmllciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcsIHBhcmFtOiAobnVtYmVyIHwgbnVtYmVyW10pW10pID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRGNzSGFuZGxlcihpZCwgY2FsbGJhY2spO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlckVzY0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyRXNjSGFuZGxlcihpZCwgaGFuZGxlcik7XG4gIH1cbiAgcHVibGljIGFkZEVzY0hhbmRsZXIoaWQ6IElGdW5jdGlvbklkZW50aWZpZXIsIGhhbmRsZXI6ICgpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyRXNjSGFuZGxlcihpZCwgaGFuZGxlcik7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudDogbnVtYmVyLCBjYWxsYmFjazogKGRhdGE6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUucmVnaXN0ZXJPc2NIYW5kbGVyKGlkZW50LCBjYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIGFkZE9zY0hhbmRsZXIoaWRlbnQ6IG51bWJlciwgY2FsbGJhY2s6IChkYXRhOiBzdHJpbmcpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyT3NjSGFuZGxlcihpZGVudCwgY2FsbGJhY2spO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElDb3JlVGVybWluYWwgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSVVuaWNvZGVIYW5kbGluZywgSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXIgfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuXG5leHBvcnQgY2xhc3MgVW5pY29kZUFwaSBpbXBsZW1lbnRzIElVbmljb2RlSGFuZGxpbmcge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb3JlOiBJQ29yZVRlcm1pbmFsKSB7IH1cblxuICBwdWJsaWMgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS51bmljb2RlU2VydmljZS5yZWdpc3Rlcihwcm92aWRlcik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZlcnNpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZS51bmljb2RlU2VydmljZS52ZXJzaW9ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnVuaWNvZGVTZXJ2aWNlLmFjdGl2ZVZlcnNpb247XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29yZS51bmljb2RlU2VydmljZS5hY3RpdmVWZXJzaW9uID0gdmVyc2lvbjtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElBdHRyaWJ1dGVEYXRhLCBJQnVmZmVyTGluZSwgU2Nyb2xsU291cmNlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEJ1ZmZlclNldCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvQnVmZmVyU2V0JztcbmltcG9ydCB7IElCdWZmZXIsIElCdWZmZXJTZXQgfSBmcm9tICdjb21tb24vYnVmZmVyL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY29uc3QgTUlOSU1VTV9DT0xTID0gMjsgLy8gTGVzcyB0aGFuIDIgY2FuIG1lc3Mgd2l0aCB3aWRlIGNoYXJzXG5leHBvcnQgY29uc3QgTUlOSU1VTV9ST1dTID0gMTtcblxuZXhwb3J0IGNsYXNzIEJ1ZmZlclNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUJ1ZmZlclNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHVibGljIGNvbHM6IG51bWJlcjtcbiAgcHVibGljIHJvd3M6IG51bWJlcjtcbiAgcHVibGljIGJ1ZmZlcnM6IElCdWZmZXJTZXQ7XG4gIC8qKiBXaGV0aGVyIHRoZSB1c2VyIGlzIHNjcm9sbGluZyAobG9ja3MgdGhlIHNjcm9sbCBwb3NpdGlvbikgKi9cbiAgcHVibGljIGlzVXNlclNjcm9sbGluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uUmVzaXplID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHsgY29sczogbnVtYmVyLCByb3dzOiBudW1iZXIgfT4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlc2l6ZSA9IHRoaXMuX29uUmVzaXplLmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vblNjcm9sbCA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25TY3JvbGwgPSB0aGlzLl9vblNjcm9sbC5ldmVudDtcblxuICBwdWJsaWMgZ2V0IGJ1ZmZlcigpOiBJQnVmZmVyIHsgcmV0dXJuIHRoaXMuYnVmZmVycy5hY3RpdmU7IH1cblxuICAvKiogQW4gSUJ1ZmZlcmxpbmUgdG8gY2xvbmUvY29weSBmcm9tIGZvciBuZXcgYmxhbmsgbGluZXMgKi9cbiAgcHJpdmF0ZSBfY2FjaGVkQmxhbmtMaW5lOiBJQnVmZmVyTGluZSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihASU9wdGlvbnNTZXJ2aWNlIG9wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29scyA9IE1hdGgubWF4KG9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMuY29scyB8fCAwLCBNSU5JTVVNX0NPTFMpO1xuICAgIHRoaXMucm93cyA9IE1hdGgubWF4KG9wdGlvbnNTZXJ2aWNlLnJhd09wdGlvbnMucm93cyB8fCAwLCBNSU5JTVVNX1JPV1MpO1xuICAgIHRoaXMuYnVmZmVycyA9IHRoaXMucmVnaXN0ZXIobmV3IEJ1ZmZlclNldChvcHRpb25zU2VydmljZSwgdGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29scyA9IGNvbHM7XG4gICAgdGhpcy5yb3dzID0gcm93cztcbiAgICB0aGlzLmJ1ZmZlcnMucmVzaXplKGNvbHMsIHJvd3MpO1xuICAgIC8vIFRPRE86IFRoaXMgZG9lc24ndCBmaXJlIHdoZW4gc2Nyb2xsYmFjayBjaGFuZ2VzIC0gYWRkIGEgcmVzaXplIGV2ZW50IHRvIEJ1ZmZlclNldCBhbmQgZm9yd2FyZFxuICAgIC8vICAgICAgIGV2ZW50XG4gICAgdGhpcy5fb25SZXNpemUuZmlyZSh7IGNvbHMsIHJvd3MgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXJzLnJlc2V0KCk7XG4gICAgdGhpcy5pc1VzZXJTY3JvbGxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgdGhlIHRlcm1pbmFsIGRvd24gMSByb3csIGNyZWF0aW5nIGEgYmxhbmsgbGluZS5cbiAgICogQHBhcmFtIGVyYXNlQXR0ciBUaGUgYXR0cmlidXRlIGRhdGEgdG8gdXNlIHRoZSBmb3IgYmxhbmsgbGluZS5cbiAgICogQHBhcmFtIGlzV3JhcHBlZCBXaGV0aGVyIHRoZSBuZXcgbGluZSBpcyB3cmFwcGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsKGVyYXNlQXR0cjogSUF0dHJpYnV0ZURhdGEsIGlzV3JhcHBlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7XG5cbiAgICBsZXQgbmV3TGluZTogSUJ1ZmZlckxpbmUgfCB1bmRlZmluZWQ7XG4gICAgbmV3TGluZSA9IHRoaXMuX2NhY2hlZEJsYW5rTGluZTtcbiAgICBpZiAoIW5ld0xpbmUgfHwgbmV3TGluZS5sZW5ndGggIT09IHRoaXMuY29scyB8fCBuZXdMaW5lLmdldEZnKDApICE9PSBlcmFzZUF0dHIuZmcgfHwgbmV3TGluZS5nZXRCZygwKSAhPT0gZXJhc2VBdHRyLmJnKSB7XG4gICAgICBuZXdMaW5lID0gYnVmZmVyLmdldEJsYW5rTGluZShlcmFzZUF0dHIsIGlzV3JhcHBlZCk7XG4gICAgICB0aGlzLl9jYWNoZWRCbGFua0xpbmUgPSBuZXdMaW5lO1xuICAgIH1cbiAgICBuZXdMaW5lLmlzV3JhcHBlZCA9IGlzV3JhcHBlZDtcblxuICAgIGNvbnN0IHRvcFJvdyA9IGJ1ZmZlci55YmFzZSArIGJ1ZmZlci5zY3JvbGxUb3A7XG4gICAgY29uc3QgYm90dG9tUm93ID0gYnVmZmVyLnliYXNlICsgYnVmZmVyLnNjcm9sbEJvdHRvbTtcblxuICAgIGlmIChidWZmZXIuc2Nyb2xsVG9wID09PSAwKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYnVmZmVyIGlzIGdvaW5nIHRvIGJlIHRyaW1tZWQgYWZ0ZXIgaW5zZXJ0aW9uLlxuICAgICAgY29uc3Qgd2lsbEJ1ZmZlckJlVHJpbW1lZCA9IGJ1ZmZlci5saW5lcy5pc0Z1bGw7XG5cbiAgICAgIC8vIEluc2VydCB0aGUgbGluZSB1c2luZyB0aGUgZmFzdGVzdCBtZXRob2RcbiAgICAgIGlmIChib3R0b21Sb3cgPT09IGJ1ZmZlci5saW5lcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmICh3aWxsQnVmZmVyQmVUcmltbWVkKSB7XG4gICAgICAgICAgYnVmZmVyLmxpbmVzLnJlY3ljbGUoKS5jb3B5RnJvbShuZXdMaW5lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXIubGluZXMucHVzaChuZXdMaW5lLmNsb25lKCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIubGluZXMuc3BsaWNlKGJvdHRvbVJvdyArIDEsIDAsIG5ld0xpbmUuY2xvbmUoKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgYWRqdXN0IHliYXNlIGFuZCB5ZGlzcCB3aGVuIHRoZSBidWZmZXIgaXMgbm90IHRyaW1tZWRcbiAgICAgIGlmICghd2lsbEJ1ZmZlckJlVHJpbW1lZCkge1xuICAgICAgICBidWZmZXIueWJhc2UrKztcbiAgICAgICAgLy8gT25seSBzY3JvbGwgdGhlIHlkaXNwIHdpdGggeWJhc2UgaWYgdGhlIHVzZXIgaGFzIG5vdCBzY3JvbGxlZCB1cFxuICAgICAgICBpZiAoIXRoaXMuaXNVc2VyU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgYnVmZmVyLnlkaXNwKys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsIGFuZCB0aGUgdXNlciBoYXMgc2Nyb2xsZWQgdXAsIGtlZXAgdGhlIHRleHRcbiAgICAgICAgLy8gc3RhYmxlIHVubGVzcyB5ZGlzcCBpcyByaWdodCBhdCB0aGUgdG9wXG4gICAgICAgIGlmICh0aGlzLmlzVXNlclNjcm9sbGluZykge1xuICAgICAgICAgIGJ1ZmZlci55ZGlzcCA9IE1hdGgubWF4KGJ1ZmZlci55ZGlzcCAtIDEsIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNjcm9sbFRvcCBpcyBub24temVybyB3aGljaCBtZWFucyBubyBsaW5lIHdpbGwgYmUgZ29pbmcgdG8gdGhlXG4gICAgICAvLyBzY3JvbGxiYWNrLCBpbnN0ZWFkIHdlIGNhbiBqdXN0IHNoaWZ0IHRoZW0gaW4tcGxhY2UuXG4gICAgICBjb25zdCBzY3JvbGxSZWdpb25IZWlnaHQgPSBib3R0b21Sb3cgLSB0b3BSb3cgKyAxIC8qIGFzIGl0J3MgemVyby1iYXNlZCAqLztcbiAgICAgIGJ1ZmZlci5saW5lcy5zaGlmdEVsZW1lbnRzKHRvcFJvdyArIDEsIHNjcm9sbFJlZ2lvbkhlaWdodCAtIDEsIC0xKTtcbiAgICAgIGJ1ZmZlci5saW5lcy5zZXQoYm90dG9tUm93LCBuZXdMaW5lLmNsb25lKCkpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdGhlIHZpZXdwb3J0IHRvIHRoZSBib3R0b20gb2YgdGhlIGJ1ZmZlciB1bmxlc3MgdGhlIHVzZXIgaXNcbiAgICAvLyBzY3JvbGxpbmcuXG4gICAgaWYgKCF0aGlzLmlzVXNlclNjcm9sbGluZykge1xuICAgICAgYnVmZmVyLnlkaXNwID0gYnVmZmVyLnliYXNlO1xuICAgIH1cblxuICAgIHRoaXMuX29uU2Nyb2xsLmZpcmUoYnVmZmVyLnlkaXNwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgdGhlIGRpc3BsYXkgb2YgdGhlIHRlcm1pbmFsXG4gICAqIEBwYXJhbSBkaXNwIFRoZSBudW1iZXIgb2YgbGluZXMgdG8gc2Nyb2xsIGRvd24gKG5lZ2F0aXZlIHNjcm9sbCB1cCkuXG4gICAqIEBwYXJhbSBzdXBwcmVzc1Njcm9sbEV2ZW50IERvbid0IGVtaXQgdGhlIHNjcm9sbCBldmVudCBhcyBzY3JvbGxMaW5lcy4gVGhpcyBpcyB1c2VkXG4gICAqIHRvIGF2b2lkIHVud2FudGVkIGV2ZW50cyBiZWluZyBoYW5kbGVkIGJ5IHRoZSB2aWV3cG9ydCB3aGVuIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIGZyb20gdGhlXG4gICAqIHZpZXdwb3J0IG9yaWdpbmFsbHkuXG4gICAqL1xuICBwdWJsaWMgc2Nyb2xsTGluZXMoZGlzcDogbnVtYmVyLCBzdXBwcmVzc1Njcm9sbEV2ZW50PzogYm9vbGVhbiwgc291cmNlPzogU2Nyb2xsU291cmNlKTogdm9pZCB7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXI7XG4gICAgaWYgKGRpc3AgPCAwKSB7XG4gICAgICBpZiAoYnVmZmVyLnlkaXNwID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXNVc2VyU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRpc3AgKyBidWZmZXIueWRpc3AgPj0gYnVmZmVyLnliYXNlKSB7XG4gICAgICB0aGlzLmlzVXNlclNjcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFlkaXNwID0gYnVmZmVyLnlkaXNwO1xuICAgIGJ1ZmZlci55ZGlzcCA9IE1hdGgubWF4KE1hdGgubWluKGJ1ZmZlci55ZGlzcCArIGRpc3AsIGJ1ZmZlci55YmFzZSksIDApO1xuXG4gICAgLy8gTm8gY2hhbmdlIG9jY3VycmVkLCBkb24ndCB0cmlnZ2VyIHNjcm9sbC9yZWZyZXNoXG4gICAgaWYgKG9sZFlkaXNwID09PSBidWZmZXIueWRpc3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN1cHByZXNzU2Nyb2xsRXZlbnQpIHtcbiAgICAgIHRoaXMuX29uU2Nyb2xsLmZpcmUoYnVmZmVyLnlkaXNwKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHsgSUNoYXJzZXRTZXJ2aWNlIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IElDaGFyc2V0IH0gZnJvbSAnY29tbW9uL1R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENoYXJzZXRTZXJ2aWNlIGltcGxlbWVudHMgSUNoYXJzZXRTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHB1YmxpYyBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGdsZXZlbDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIF9jaGFyc2V0czogKElDaGFyc2V0IHwgdW5kZWZpbmVkKVtdID0gW107XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhcnNldCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jaGFyc2V0cyA9IFtdO1xuICAgIHRoaXMuZ2xldmVsID0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRnTGV2ZWwoZzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nbGV2ZWwgPSBnO1xuICAgIHRoaXMuY2hhcnNldCA9IHRoaXMuX2NoYXJzZXRzW2ddO1xuICB9XG5cbiAgcHVibGljIHNldGdDaGFyc2V0KGc6IG51bWJlciwgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFyc2V0c1tnXSA9IGNoYXJzZXQ7XG4gICAgaWYgKHRoaXMuZ2xldmVsID09PSBnKSB7XG4gICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElDb3JlU2VydmljZSwgSUNvcmVNb3VzZVNlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnY29tbW9uL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJQ29yZU1vdXNlUHJvdG9jb2wsIElDb3JlTW91c2VFdmVudCwgQ29yZU1vdXNlRW5jb2RpbmcsIENvcmVNb3VzZUV2ZW50VHlwZSwgQ29yZU1vdXNlQnV0dG9uLCBDb3JlTW91c2VBY3Rpb24gfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBkZWZhdWx0IHByb3RvY29scy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUk9UT0NPTFM6IHsgW2tleTogc3RyaW5nXTogSUNvcmVNb3VzZVByb3RvY29sIH0gPSB7XG4gIC8qKlxuICAgKiBOT05FXG4gICAqIEV2ZW50czogbm9uZVxuICAgKiBNb2RpZmllcnM6IG5vbmVcbiAgICovXG4gIE5PTkU6IHtcbiAgICBldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZS5OT05FLFxuICAgIHJlc3RyaWN0OiAoKSA9PiBmYWxzZVxuICB9LFxuICAvKipcbiAgICogWDEwXG4gICAqIEV2ZW50czogbW91c2Vkb3duXG4gICAqIE1vZGlmaWVyczogbm9uZVxuICAgKi9cbiAgWDEwOiB7XG4gICAgZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUuRE9XTixcbiAgICByZXN0cmljdDogKGU6IElDb3JlTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gbm8gd2hlZWwsIG5vIG1vdmUsIG5vIHVwXG4gICAgICBpZiAoZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCB8fCBlLmFjdGlvbiAhPT0gQ29yZU1vdXNlQWN0aW9uLkRPV04pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gbm8gbW9kaWZpZXJzXG4gICAgICBlLmN0cmwgPSBmYWxzZTtcbiAgICAgIGUuYWx0ID0gZmFsc2U7XG4gICAgICBlLnNoaWZ0ID0gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIC8qKlxuICAgKiBWVDIwMFxuICAgKiBFdmVudHM6IG1vdXNlZG93biAvIG1vdXNldXAgLyB3aGVlbFxuICAgKiBNb2RpZmllcnM6IGFsbFxuICAgKi9cbiAgVlQyMDA6IHtcbiAgICBldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOIHwgQ29yZU1vdXNlRXZlbnRUeXBlLlVQIHwgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMLFxuICAgIHJlc3RyaWN0OiAoZTogSUNvcmVNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAvLyBubyBtb3ZlXG4gICAgICBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5NT1ZFKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIERSQUdcbiAgICogRXZlbnRzOiBtb3VzZWRvd24gLyBtb3VzZXVwIC8gd2hlZWwgLyBtb3VzZWRyYWdcbiAgICogTW9kaWZpZXJzOiBhbGxcbiAgICovXG4gIERSQUc6IHtcbiAgICBldmVudHM6IENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOIHwgQ29yZU1vdXNlRXZlbnRUeXBlLlVQIHwgQ29yZU1vdXNlRXZlbnRUeXBlLldIRUVMIHwgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcsXG4gICAgcmVzdHJpY3Q6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHtcbiAgICAgIC8vIG5vIG1vdmUgd2l0aG91dCBidXR0b25cbiAgICAgIGlmIChlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLk1PVkUgJiYgZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5OT05FKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbiAgLyoqXG4gICAqIEFOWVxuICAgKiBFdmVudHM6IGFsbCBtb3VzZSByZWxhdGVkIGV2ZW50c1xuICAgKiBNb2RpZmllcnM6IGFsbFxuICAgKi9cbiAgQU5ZOiB7XG4gICAgZXZlbnRzOlxuICAgICAgQ29yZU1vdXNlRXZlbnRUeXBlLkRPV04gfCBDb3JlTW91c2VFdmVudFR5cGUuVVAgfCBDb3JlTW91c2VFdmVudFR5cGUuV0hFRUxcbiAgICAgIHwgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcgfCBDb3JlTW91c2VFdmVudFR5cGUuTU9WRSxcbiAgICByZXN0cmljdDogKGU6IElDb3JlTW91c2VFdmVudCkgPT4gdHJ1ZVxuICB9XG59O1xuXG5jb25zdCBlbnVtIE1vZGlmaWVycyB7XG4gIFNISUZUID0gNCxcbiAgQUxUID0gOCxcbiAgQ1RSTCA9IDE2XG59XG5cbi8vIGhlbHBlciBmb3IgZGVmYXVsdCBlbmNvZGVycyB0byBnZW5lcmF0ZSB0aGUgZXZlbnQgY29kZS5cbmZ1bmN0aW9uIGV2ZW50Q29kZShlOiBJQ29yZU1vdXNlRXZlbnQsIGlzU0dSOiBib29sZWFuKTogbnVtYmVyIHtcbiAgbGV0IGNvZGUgPSAoZS5jdHJsID8gTW9kaWZpZXJzLkNUUkwgOiAwKSB8IChlLnNoaWZ0ID8gTW9kaWZpZXJzLlNISUZUIDogMCkgfCAoZS5hbHQgPyBNb2RpZmllcnMuQUxUIDogMCk7XG4gIGlmIChlLmJ1dHRvbiA9PT0gQ29yZU1vdXNlQnV0dG9uLldIRUVMKSB7XG4gICAgY29kZSB8PSA2NDtcbiAgICBjb2RlIHw9IGUuYWN0aW9uO1xuICB9IGVsc2Uge1xuICAgIGNvZGUgfD0gZS5idXR0b24gJiAzO1xuICAgIGlmIChlLmJ1dHRvbiAmIDQpIHtcbiAgICAgIGNvZGUgfD0gNjQ7XG4gICAgfVxuICAgIGlmIChlLmJ1dHRvbiAmIDgpIHtcbiAgICAgIGNvZGUgfD0gMTI4O1xuICAgIH1cbiAgICBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5NT1ZFKSB7XG4gICAgICBjb2RlIHw9IENvcmVNb3VzZUFjdGlvbi5NT1ZFO1xuICAgIH0gZWxzZSBpZiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5VUCAmJiAhaXNTR1IpIHtcbiAgICAgIC8vIHNwZWNpYWwgY2FzZSAtIG9ubHkgU0dSIGNhbiByZXBvcnQgYnV0dG9uIG9uIHJlbGVhc2VcbiAgICAgIC8vIGFsbCBvdGhlcnMgaGF2ZSB0byBnbyB3aXRoIE5PTkVcbiAgICAgIGNvZGUgfD0gQ29yZU1vdXNlQnV0dG9uLk5PTkU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb2RlO1xufVxuXG5jb25zdCBTID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuLyoqXG4gKiBTdXBwb3J0ZWQgZGVmYXVsdCBlbmNvZGluZ3MuXG4gKi9cbmNvbnN0IERFRkFVTFRfRU5DT0RJTkdTOiB7IFtrZXk6IHN0cmluZ106IENvcmVNb3VzZUVuY29kaW5nIH0gPSB7XG4gIC8qKlxuICAgKiBERUZBVUxUIC0gQ1NJIE0gUGIgUHggUHlcbiAgICogU2luZ2xlIGJ5dGUgZW5jb2RpbmcgZm9yIGNvb3JkcyBhbmQgZXZlbnQgY29kZS5cbiAgICogQ2FuIGVuY29kZSB2YWx1ZXMgdXAgdG8gMjIzICgxLWJhc2VkKS5cbiAgICovXG4gIERFRkFVTFQ6IChlOiBJQ29yZU1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBbZXZlbnRDb2RlKGUsIGZhbHNlKSArIDMyLCBlLmNvbCArIDMyLCBlLnJvdyArIDMyXTtcbiAgICAvLyBzdXByZXNzIG1vdXNlIHJlcG9ydCBpZiB3ZSBleGNlZWQgYWRkcmVzc2libGUgcmFuZ2VcbiAgICAvLyBOb3RlIHRoaXMgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBieSBlbXVsYXRvcnNcbiAgICAvLyAtIHh0ZXJtOiAgICAgICAgIHNlbmRzIDA7MCBjb29yZHMgaW5zdGVhZFxuICAgIC8vIC0gdnRlLCBrb25zb2xlOiAgbm8gcmVwb3J0XG4gICAgaWYgKHBhcmFtc1swXSA+IDI1NSB8fCBwYXJhbXNbMV0gPiAyNTUgfHwgcGFyYW1zWzJdID4gMjU1KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBgXFx4MWJbTSR7UyhwYXJhbXNbMF0pfSR7UyhwYXJhbXNbMV0pfSR7UyhwYXJhbXNbMl0pfWA7XG4gIH0sXG4gIC8qKlxuICAgKiBTR1IgLSBDU0kgPCBQYiA7IFB4IDsgUHkgTXxtXG4gICAqIE5vIGVuY29kaW5nIGxpbWl0YXRpb24uXG4gICAqIENhbiByZXBvcnQgYnV0dG9uIG9uIHJlbGVhc2UgYW5kIHdvcmtzIHdpdGggYSB3ZWxsIGZvcm1lZCBzZXF1ZW5jZS5cbiAgICovXG4gIFNHUjogKGU6IElDb3JlTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsID0gKGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uVVAgJiYgZS5idXR0b24gIT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCkgPyAnbScgOiAnTSc7XG4gICAgcmV0dXJuIGBcXHgxYls8JHtldmVudENvZGUoZSwgdHJ1ZSl9OyR7ZS5jb2x9OyR7ZS5yb3d9JHtmaW5hbH1gO1xuICB9LFxuICBTR1JfUElYRUxTOiAoZTogSUNvcmVNb3VzZUV2ZW50KSA9PiB7XG4gICAgY29uc3QgZmluYWwgPSAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5VUCAmJiBlLmJ1dHRvbiAhPT0gQ29yZU1vdXNlQnV0dG9uLldIRUVMKSA/ICdtJyA6ICdNJztcbiAgICByZXR1cm4gYFxceDFiWzwke2V2ZW50Q29kZShlLCB0cnVlKX07JHtlLnh9OyR7ZS55fSR7ZmluYWx9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBDb3JlTW91c2VTZXJ2aWNlXG4gKlxuICogUHJvdmlkZXMgbW91c2UgdHJhY2tpbmcgcmVwb3J0cyB3aXRoIGRpZmZlcmVudCBwcm90b2NvbHMgYW5kIGVuY29kaW5ncy5cbiAqICAtIHByb3RvY29sczogTk9ORSAoZGVmYXVsdCksIFgxMCwgVlQyMDAsIERSQUcsIEFOWVxuICogIC0gZW5jb2RpbmdzOiBERUZBVUxULCBTR1IgKFVURjgsIFVSWFZUIHJlbW92ZWQgaW4gIzI1MDcpXG4gKlxuICogQ3VzdG9tIHByb3RvY29scy9lbmNvZGluZ3MgY2FuIGJlIGFkZGVkIGJ5IGBhZGRQcm90b2NvbGAgLyBgYWRkRW5jb2RpbmdgLlxuICogVG8gYWN0aXZhdGUgYSBwcm90b2NvbC9lbmNvZGluZywgc2V0IGBhY3RpdmVQcm90b2NvbGAgLyBgYWN0aXZlRW5jb2RpbmdgLlxuICogU3dpdGNoaW5nIGEgcHJvdG9jb2wgd2lsbCBzZW5kIGEgbm90aWZpY2F0aW9uIGV2ZW50IGBvblByb3RvY29sQ2hhbmdlYFxuICogd2l0aCBhIGxpc3Qgb2YgbmVlZGVkIGV2ZW50cyB0byB0cmFjay5cbiAqXG4gKiBUaGUgc2VydmljZSBoYW5kbGVzIHRoZSBtb3VzZSB0cmFja2luZyBzdGF0ZSBhbmQgZGVjaWRlcyB3aGV0aGVyIHRvIHNlbmRcbiAqIGEgdHJhY2tpbmcgcmVwb3J0IHRvIHRoZSBiYWNrZW5kIGJhc2VkIG9uIHByb3RvY29sIGFuZCBlbmNvZGluZyBsaW1pdGF0aW9ucy5cbiAqIFRvIHNlbmQgYSBtb3VzZSBldmVudCBjYWxsIGB0cmlnZ2VyTW91c2VFdmVudGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb3JlTW91c2VTZXJ2aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSBpbXBsZW1lbnRzIElDb3JlTW91c2VTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfcHJvdG9jb2xzOiB7IFtuYW1lOiBzdHJpbmddOiBJQ29yZU1vdXNlUHJvdG9jb2wgfSA9IHt9O1xuICBwcml2YXRlIF9lbmNvZGluZ3M6IHsgW25hbWU6IHN0cmluZ106IENvcmVNb3VzZUVuY29kaW5nIH0gPSB7fTtcbiAgcHJpdmF0ZSBfYWN0aXZlUHJvdG9jb2w6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9hY3RpdmVFbmNvZGluZzogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2xhc3RFdmVudDogSUNvcmVNb3VzZUV2ZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25Qcm90b2NvbENoYW5nZSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxDb3JlTW91c2VFdmVudFR5cGU+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25Qcm90b2NvbENoYW5nZSA9ICB0aGlzLl9vblByb3RvY29sQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUNvcmVTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX2NvcmVTZXJ2aWNlOiBJQ29yZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvLyByZWdpc3RlciBkZWZhdWx0IHByb3RvY29scyBhbmQgZW5jb2RpbmdzXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKERFRkFVTFRfUFJPVE9DT0xTKSkgdGhpcy5hZGRQcm90b2NvbChuYW1lLCBERUZBVUxUX1BST1RPQ09MU1tuYW1lXSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKERFRkFVTFRfRU5DT0RJTkdTKSkgdGhpcy5hZGRFbmNvZGluZyhuYW1lLCBERUZBVUxUX0VOQ09ESU5HU1tuYW1lXSk7XG4gICAgLy8gY2FsbCByZXNldCB0byBzZXQgZGVmYXVsdHNcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvdG9jb2wobmFtZTogc3RyaW5nLCBwcm90b2NvbDogSUNvcmVNb3VzZVByb3RvY29sKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvdG9jb2xzW25hbWVdID0gcHJvdG9jb2w7XG4gIH1cblxuICBwdWJsaWMgYWRkRW5jb2RpbmcobmFtZTogc3RyaW5nLCBlbmNvZGluZzogQ29yZU1vdXNlRW5jb2RpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmNvZGluZ3NbbmFtZV0gPSBlbmNvZGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlUHJvdG9jb2woKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlUHJvdG9jb2w7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFyZU1vdXNlRXZlbnRzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm90b2NvbHNbdGhpcy5fYWN0aXZlUHJvdG9jb2xdLmV2ZW50cyAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlUHJvdG9jb2wobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9wcm90b2NvbHNbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBwcm90b2NvbCBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVQcm90b2NvbCA9IG5hbWU7XG4gICAgdGhpcy5fb25Qcm90b2NvbENoYW5nZS5maXJlKHRoaXMuX3Byb3RvY29sc1tuYW1lXS5ldmVudHMpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVFbmNvZGluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVFbmNvZGluZztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlRW5jb2RpbmcobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLl9lbmNvZGluZ3NbbmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBlbmNvZGluZyBcIiR7bmFtZX1cImApO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmVFbmNvZGluZyA9IG5hbWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmVQcm90b2NvbCA9ICdOT05FJztcbiAgICB0aGlzLmFjdGl2ZUVuY29kaW5nID0gJ0RFRkFVTFQnO1xuICAgIHRoaXMuX2xhc3RFdmVudCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBtb3VzZSBldmVudCB0byBiZSBzZW50LlxuICAgKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHBhc3NlZCBhbGwgcHJvdG9jb2wgcmVzdHJpY3Rpb25zIGFuZCBhIHJlcG9ydFxuICAgKiB3YXMgc2VudCwgb3RoZXJ3aXNlIGZhbHNlLiBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyXG4gICAqIHRoZSBkZWZhdWx0IGV2ZW50IGFjdGlvbiBpbiB0aGUgYm93c2VyIGNvbXBvbmVudCBzaG91bGQgYmUgb21pdHRlZC5cbiAgICpcbiAgICogTm90ZTogVGhlIG1ldGhvZCB3aWxsIGNoYW5nZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGV2ZW50IG9iamVjdFxuICAgKiB0byBmdWxsZmlsbCBwcm90b2NvbCBhbmQgZW5jb2RpbmcgcmVzdHJpY3Rpb25zLlxuICAgKi9cbiAgcHVibGljIHRyaWdnZXJNb3VzZUV2ZW50KGU6IElDb3JlTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgIC8vIHJhbmdlIGNoZWNrIGZvciBjb2wvcm93XG4gICAgaWYgKGUuY29sIDwgMCB8fCBlLmNvbCA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLmNvbHNcbiAgICAgIHx8IGUucm93IDwgMCB8fCBlLnJvdyA+PSB0aGlzLl9idWZmZXJTZXJ2aWNlLnJvd3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgbm9uc2Vuc2UgY29tYmluYXRpb25zIG9mIGJ1dHRvbiArIGFjdGlvblxuICAgIGlmIChlLmJ1dHRvbiA9PT0gQ29yZU1vdXNlQnV0dG9uLldIRUVMICYmIGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uTU9WRSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZS5idXR0b24gPT09IENvcmVNb3VzZUJ1dHRvbi5OT05FICYmIGUuYWN0aW9uICE9PSBDb3JlTW91c2VBY3Rpb24uTU9WRSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZS5idXR0b24gIT09IENvcmVNb3VzZUJ1dHRvbi5XSEVFTCAmJiAoZS5hY3Rpb24gPT09IENvcmVNb3VzZUFjdGlvbi5MRUZUIHx8IGUuYWN0aW9uID09PSBDb3JlTW91c2VBY3Rpb24uUklHSFQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcmVwb3J0IDEtYmFzZWQgY29vcmRzXG4gICAgZS5jb2wrKztcbiAgICBlLnJvdysrO1xuXG4gICAgLy8gZGVib3VuY2UgbW92ZSBldmVudHMgYXQgZ3JpZCBvciBwaXhlbCBsZXZlbFxuICAgIGlmIChlLmFjdGlvbiA9PT0gQ29yZU1vdXNlQWN0aW9uLk1PVkVcbiAgICAgICYmIHRoaXMuX2xhc3RFdmVudFxuICAgICAgJiYgdGhpcy5fZXF1YWxFdmVudHModGhpcy5fbGFzdEV2ZW50LCBlLCB0aGlzLl9hY3RpdmVFbmNvZGluZyA9PT0gJ1NHUl9QSVhFTFMnKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHByb3RvY29sIHJlc3RyaWN0aW9uc1xuICAgIGlmICghdGhpcy5fcHJvdG9jb2xzW3RoaXMuX2FjdGl2ZVByb3RvY29sXS5yZXN0cmljdChlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGVuY29kZSByZXBvcnQgYW5kIHNlbmRcbiAgICBjb25zdCByZXBvcnQgPSB0aGlzLl9lbmNvZGluZ3NbdGhpcy5fYWN0aXZlRW5jb2RpbmddKGUpO1xuICAgIGlmIChyZXBvcnQpIHtcbiAgICAgIC8vIGFsd2F5cyBzZW5kIERFRkFVTFQgYXMgYmluYXJ5IGRhdGFcbiAgICAgIGlmICh0aGlzLl9hY3RpdmVFbmNvZGluZyA9PT0gJ0RFRkFVTFQnKSB7XG4gICAgICAgIHRoaXMuX2NvcmVTZXJ2aWNlLnRyaWdnZXJCaW5hcnlFdmVudChyZXBvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29yZVNlcnZpY2UudHJpZ2dlckRhdGFFdmVudChyZXBvcnQsIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2xhc3RFdmVudCA9IGU7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBleHBsYWluRXZlbnRzKGV2ZW50czogQ29yZU1vdXNlRXZlbnRUeXBlKTogeyBbZXZlbnQ6IHN0cmluZ106IGJvb2xlYW4gfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvd246ICEhKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5ET1dOKSxcbiAgICAgIHVwOiAhIShldmVudHMgJiBDb3JlTW91c2VFdmVudFR5cGUuVVApLFxuICAgICAgZHJhZzogISEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLkRSQUcpLFxuICAgICAgbW92ZTogISEoZXZlbnRzICYgQ29yZU1vdXNlRXZlbnRUeXBlLk1PVkUpLFxuICAgICAgd2hlZWw6ICEhKGV2ZW50cyAmIENvcmVNb3VzZUV2ZW50VHlwZS5XSEVFTClcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZXF1YWxFdmVudHMoZTE6IElDb3JlTW91c2VFdmVudCwgZTI6IElDb3JlTW91c2VFdmVudCwgcGl4ZWxzOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgaWYgKHBpeGVscykge1xuICAgICAgaWYgKGUxLnggIT09IGUyLngpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChlMS55ICE9PSBlMi55KSByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlMS5jb2wgIT09IGUyLmNvbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKGUxLnJvdyAhPT0gZTIucm93KSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChlMS5idXR0b24gIT09IGUyLmJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlMS5hY3Rpb24gIT09IGUyLmFjdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChlMS5jdHJsICE9PSBlMi5jdHJsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGUxLmFsdCAhPT0gZTIuYWx0KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGUxLnNoaWZ0ICE9PSBlMi5zaGlmdCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnY29tbW9uL0Nsb25lJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURlY1ByaXZhdGVNb2RlcywgSU1vZGVzIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IElCdWZmZXJTZXJ2aWNlLCBJQ29yZVNlcnZpY2UsIElMb2dTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBERUZBVUxUX01PREVTOiBJTW9kZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgaW5zZXJ0TW9kZTogZmFsc2Vcbn0pO1xuXG5jb25zdCBERUZBVUxUX0RFQ19QUklWQVRFX01PREVTOiBJRGVjUHJpdmF0ZU1vZGVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGFwcGxpY2F0aW9uQ3Vyc29yS2V5czogZmFsc2UsXG4gIGFwcGxpY2F0aW9uS2V5cGFkOiBmYWxzZSxcbiAgYnJhY2tldGVkUGFzdGVNb2RlOiBmYWxzZSxcbiAgb3JpZ2luOiBmYWxzZSxcbiAgcmV2ZXJzZVdyYXBhcm91bmQ6IGZhbHNlLFxuICBzZW5kRm9jdXM6IGZhbHNlLFxuICB3cmFwYXJvdW5kOiB0cnVlIC8vIGRlZmF1bHRzOiB4dGVybSAtIHRydWUsIHZ0MTAwIC0gZmFsc2Vcbn0pO1xuXG5leHBvcnQgY2xhc3MgQ29yZVNlcnZpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUNvcmVTZXJ2aWNlIHtcbiAgcHVibGljIHNlcnZpY2VCcmFuZDogYW55O1xuXG4gIHB1YmxpYyBpc0N1cnNvckluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBpc0N1cnNvckhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgbW9kZXM6IElNb2RlcztcbiAgcHVibGljIGRlY1ByaXZhdGVNb2RlczogSURlY1ByaXZhdGVNb2RlcztcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRhdGEgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpKTtcbiAgcHVibGljIHJlYWRvbmx5IG9uRGF0YSA9IHRoaXMuX29uRGF0YS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25Vc2VySW5wdXQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblVzZXJJbnB1dCA9IHRoaXMuX29uVXNlcklucHV0LmV2ZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkJpbmFyeSA9IHRoaXMucmVnaXN0ZXIobmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25CaW5hcnkgPSB0aGlzLl9vbkJpbmFyeS5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b20gPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvblJlcXVlc3RTY3JvbGxUb0JvdHRvbSA9IHRoaXMuX29uUmVxdWVzdFNjcm9sbFRvQm90dG9tLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZSxcbiAgICBASUxvZ1NlcnZpY2UgcHJpdmF0ZSByZWFkb25seSBfbG9nU2VydmljZTogSUxvZ1NlcnZpY2UsXG4gICAgQElPcHRpb25zU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zU2VydmljZTogSU9wdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tb2RlcyA9IGNsb25lKERFRkFVTFRfTU9ERVMpO1xuICAgIHRoaXMuZGVjUHJpdmF0ZU1vZGVzID0gY2xvbmUoREVGQVVMVF9ERUNfUFJJVkFURV9NT0RFUyk7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5tb2RlcyA9IGNsb25lKERFRkFVTFRfTU9ERVMpO1xuICAgIHRoaXMuZGVjUHJpdmF0ZU1vZGVzID0gY2xvbmUoREVGQVVMVF9ERUNfUFJJVkFURV9NT0RFUyk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlckRhdGFFdmVudChkYXRhOiBzdHJpbmcsIHdhc1VzZXJJbnB1dDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gUHJldmVudHMgYWxsIGV2ZW50cyB0byBwdHkgcHJvY2VzcyBpZiBzdGRpbiBpcyBkaXNhYmxlZFxuICAgIGlmICh0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmRpc2FibGVTdGRpbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElucHV0IGlzIGJlaW5nIHNlbnQgdG8gdGhlIHRlcm1pbmFsLCB0aGUgdGVybWluYWwgc2hvdWxkIGZvY3VzIHRoZSBwcm9tcHQuXG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5fYnVmZmVyU2VydmljZS5idWZmZXI7XG4gICAgaWYgKHdhc1VzZXJJbnB1dCAmJiB0aGlzLl9vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLnNjcm9sbE9uVXNlcklucHV0ICYmIGJ1ZmZlci55YmFzZSAhPT0gYnVmZmVyLnlkaXNwKSB7XG4gICAgICB0aGlzLl9vblJlcXVlc3RTY3JvbGxUb0JvdHRvbS5maXJlKCk7XG4gICAgfVxuXG4gICAgLy8gRmlyZSBvblVzZXJJbnB1dCBzbyBsaXN0ZW5lcnMgY2FuIHJlYWN0IGFzIHdlbGwgKGVnLiBjbGVhciBzZWxlY3Rpb24pXG4gICAgaWYgKHdhc1VzZXJJbnB1dCkge1xuICAgICAgdGhpcy5fb25Vc2VySW5wdXQuZmlyZSgpO1xuICAgIH1cblxuICAgIC8vIEZpcmUgb25EYXRhIEFQSVxuICAgIHRoaXMuX2xvZ1NlcnZpY2UuZGVidWcoYHNlbmRpbmcgZGF0YSBcIiR7ZGF0YX1cImAsICgpID0+IGRhdGEuc3BsaXQoJycpLm1hcChlID0+IGUuY2hhckNvZGVBdCgwKSkpO1xuICAgIHRoaXMuX29uRGF0YS5maXJlKGRhdGEpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJCaW5hcnlFdmVudChkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5kaXNhYmxlU3RkaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fbG9nU2VydmljZS5kZWJ1Zyhgc2VuZGluZyBiaW5hcnkgXCIke2RhdGF9XCJgLCAoKSA9PiBkYXRhLnNwbGl0KCcnKS5tYXAoZSA9PiBlLmNoYXJDb2RlQXQoMCkpKTtcbiAgICB0aGlzLl9vbkJpbmFyeS5maXJlKGRhdGEpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAyMiBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGNzcyB9IGZyb20gJ2NvbW1vbi9Db2xvcic7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgSURlY29yYXRpb25TZXJ2aWNlLCBJSW50ZXJuYWxEZWNvcmF0aW9uIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IFNvcnRlZExpc3QgfSBmcm9tICdjb21tb24vU29ydGVkTGlzdCc7XG5pbXBvcnQgeyBJQ29sb3IgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgSURlY29yYXRpb24sIElEZWNvcmF0aW9uT3B0aW9ucywgSU1hcmtlciB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbi8vIFdvcmsgdmFyaWFibGVzIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvblxubGV0ICR4bWluID0gMDtcbmxldCAkeG1heCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBEZWNvcmF0aW9uU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJRGVjb3JhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBhbGwgZGVjb3JhdGlvbnMsIHNvcnRlZCBieSB0aGUgbWFya2VyJ3MgbGluZSB2YWx1ZS4gVGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdFxuICAgKiB3aGlsZSBtYXJrZXIgbGluZSB2YWx1ZXMgZG8gY2hhbmdlLCB0aGV5IHNob3VsZCBhbGwgY2hhbmdlIGJ5IHRoZSBzYW1lIGFtb3VudCBzbyB0aGlzIHNob3VsZFxuICAgKiBuZXZlciBiZWNvbWUgb3V0IG9mIG9yZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZGVjb3JhdGlvbnM6IFNvcnRlZExpc3Q8SUludGVybmFsRGVjb3JhdGlvbj4gPSBuZXcgU29ydGVkTGlzdChlID0+IGU/Lm1hcmtlci5saW5lKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlY29yYXRpb25SZWdpc3RlcmVkID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPElJbnRlcm5hbERlY29yYXRpb24+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EZWNvcmF0aW9uUmVnaXN0ZXJlZCA9IHRoaXMuX29uRGVjb3JhdGlvblJlZ2lzdGVyZWQuZXZlbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29uRGVjb3JhdGlvblJlbW92ZWQgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SUludGVybmFsRGVjb3JhdGlvbj4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbkRlY29yYXRpb25SZW1vdmVkID0gdGhpcy5fb25EZWNvcmF0aW9uUmVtb3ZlZC5ldmVudDtcblxuICBwdWJsaWMgZ2V0IGRlY29yYXRpb25zKCk6IEl0ZXJhYmxlSXRlcmF0b3I8SUludGVybmFsRGVjb3JhdGlvbj4geyByZXR1cm4gdGhpcy5fZGVjb3JhdGlvbnMudmFsdWVzKCk7IH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yZWdpc3Rlcih0b0Rpc3Bvc2FibGUoKCkgPT4gdGhpcy5yZXNldCgpKSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJEZWNvcmF0aW9uKG9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAob3B0aW9ucy5tYXJrZXIuaXNEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZGVjb3JhdGlvbiA9IG5ldyBEZWNvcmF0aW9uKG9wdGlvbnMpO1xuICAgIGlmIChkZWNvcmF0aW9uKSB7XG4gICAgICBjb25zdCBtYXJrZXJEaXNwb3NlID0gZGVjb3JhdGlvbi5tYXJrZXIub25EaXNwb3NlKCgpID0+IGRlY29yYXRpb24uZGlzcG9zZSgpKTtcbiAgICAgIGRlY29yYXRpb24ub25EaXNwb3NlKCgpID0+IHtcbiAgICAgICAgaWYgKGRlY29yYXRpb24pIHtcbiAgICAgICAgICBpZiAodGhpcy5fZGVjb3JhdGlvbnMuZGVsZXRlKGRlY29yYXRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkRlY29yYXRpb25SZW1vdmVkLmZpcmUoZGVjb3JhdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcmtlckRpc3Bvc2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX2RlY29yYXRpb25zLmluc2VydChkZWNvcmF0aW9uKTtcbiAgICAgIHRoaXMuX29uRGVjb3JhdGlvblJlZ2lzdGVyZWQuZmlyZShkZWNvcmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29yYXRpb247XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2RlY29yYXRpb25zLnZhbHVlcygpKSB7XG4gICAgICBkLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgdGhpcy5fZGVjb3JhdGlvbnMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyAqZ2V0RGVjb3JhdGlvbnNBdENlbGwoeDogbnVtYmVyLCBsaW5lOiBudW1iZXIsIGxheWVyPzogJ2JvdHRvbScgfCAndG9wJyk6IEl0ZXJhYmxlSXRlcmF0b3I8SUludGVybmFsRGVjb3JhdGlvbj4ge1xuICAgIGxldCB4bWluID0gMDtcbiAgICBsZXQgeG1heCA9IDA7XG4gICAgZm9yIChjb25zdCBkIG9mIHRoaXMuX2RlY29yYXRpb25zLmdldEtleUl0ZXJhdG9yKGxpbmUpKSB7XG4gICAgICB4bWluID0gZC5vcHRpb25zLnggPz8gMDtcbiAgICAgIHhtYXggPSB4bWluICsgKGQub3B0aW9ucy53aWR0aCA/PyAxKTtcbiAgICAgIGlmICh4ID49IHhtaW4gJiYgeCA8IHhtYXggJiYgKCFsYXllciB8fCAoZC5vcHRpb25zLmxheWVyID8/ICdib3R0b20nKSA9PT0gbGF5ZXIpKSB7XG4gICAgICAgIHlpZWxkIGQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHg6IG51bWJlciwgbGluZTogbnVtYmVyLCBsYXllcjogJ2JvdHRvbScgfCAndG9wJyB8IHVuZGVmaW5lZCwgY2FsbGJhY2s6IChkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fZGVjb3JhdGlvbnMuZm9yRWFjaEJ5S2V5KGxpbmUsIGQgPT4ge1xuICAgICAgJHhtaW4gPSBkLm9wdGlvbnMueCA/PyAwO1xuICAgICAgJHhtYXggPSAkeG1pbiArIChkLm9wdGlvbnMud2lkdGggPz8gMSk7XG4gICAgICBpZiAoeCA+PSAkeG1pbiAmJiB4IDwgJHhtYXggJiYgKCFsYXllciB8fCAoZC5vcHRpb25zLmxheWVyID8/ICdib3R0b20nKSA9PT0gbGF5ZXIpKSB7XG4gICAgICAgIGNhbGxiYWNrKGQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIERlY29yYXRpb24gZXh0ZW5kcyBEaXNwb3NhYmxlIGltcGxlbWVudHMgSUludGVybmFsRGVjb3JhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBtYXJrZXI6IElNYXJrZXI7XG4gIHB1YmxpYyBlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHVibGljIGdldCBpc0Rpc3Bvc2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNEaXNwb3NlZDsgfVxuXG4gIHB1YmxpYyByZWFkb25seSBvblJlbmRlckVtaXR0ZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8SFRNTEVsZW1lbnQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25SZW5kZXIgPSB0aGlzLm9uUmVuZGVyRW1pdHRlci5ldmVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBfb25EaXNwb3NlID0gdGhpcy5yZWdpc3RlcihuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCkpO1xuICBwdWJsaWMgcmVhZG9ubHkgb25EaXNwb3NlID0gdGhpcy5fb25EaXNwb3NlLmV2ZW50O1xuXG4gIHByaXZhdGUgX2NhY2hlZEJnOiBJQ29sb3IgfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIGdldCBiYWNrZ3JvdW5kQ29sb3JSR0IoKTogSUNvbG9yIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkQmcgPT09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZEJnID0gY3NzLnRvQ29sb3IodGhpcy5vcHRpb25zLmJhY2tncm91bmRDb2xvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jYWNoZWRCZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZEJnO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGVkRmc6IElDb2xvciB8IHVuZGVmaW5lZCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgZ2V0IGZvcmVncm91bmRDb2xvclJHQigpOiBJQ29sb3IgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9jYWNoZWRGZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mb3JlZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgdGhpcy5fY2FjaGVkRmcgPSBjc3MudG9Db2xvcih0aGlzLm9wdGlvbnMuZm9yZWdyb3VuZENvbG9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZEZnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkRmc7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSURlY29yYXRpb25PcHRpb25zXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5tYXJrZXIgPSBvcHRpb25zLm1hcmtlcjtcbiAgICBpZiAodGhpcy5vcHRpb25zLm92ZXJ2aWV3UnVsZXJPcHRpb25zICYmICF0aGlzLm9wdGlvbnMub3ZlcnZpZXdSdWxlck9wdGlvbnMucG9zaXRpb24pIHtcbiAgICAgIHRoaXMub3B0aW9ucy5vdmVydmlld1J1bGVyT3B0aW9ucy5wb3NpdGlvbiA9ICdmdWxsJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkRpc3Bvc2UuZmlyZSgpO1xuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqXG4gKiBUaGlzIHdhcyBoZWF2aWx5IGluc3BpcmVkIGZyb20gbWljcm9zb2Z0L3ZzY29kZSdzIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbSAoTUlUKS5cbiAqL1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCB7IElJbnN0YW50aWF0aW9uU2VydmljZSwgSVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnY29tbW9uL3NlcnZpY2VzL1NlcnZpY2VzJztcbmltcG9ydCB7IGdldFNlcnZpY2VEZXBlbmRlbmNpZXMgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcblxuZXhwb3J0IGNsYXNzIFNlcnZpY2VDb2xsZWN0aW9uIHtcblxuICBwcml2YXRlIF9lbnRyaWVzID0gbmV3IE1hcDxJU2VydmljZUlkZW50aWZpZXI8YW55PiwgYW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKC4uLmVudHJpZXM6IFtJU2VydmljZUlkZW50aWZpZXI8YW55PiwgYW55XVtdKSB7XG4gICAgZm9yIChjb25zdCBbaWQsIHNlcnZpY2VdIG9mIGVudHJpZXMpIHtcbiAgICAgIHRoaXMuc2V0KGlkLCBzZXJ2aWNlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0PFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4sIGluc3RhbmNlOiBUKTogVCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZW50cmllcy5nZXQoaWQpO1xuICAgIHRoaXMuX2VudHJpZXMuc2V0KGlkLCBpbnN0YW5jZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBmb3JFYWNoKGNhbGxiYWNrOiAoaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+LCBpbnN0YW5jZTogYW55KSA9PiBhbnkpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgY2FsbGJhY2soa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhcyhpZDogSVNlcnZpY2VJZGVudGlmaWVyPGFueT4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW50cmllcy5oYXMoaWQpO1xuICB9XG5cbiAgcHVibGljIGdldDxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+KTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXMuZ2V0KGlkKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSW5zdGFudGlhdGlvblNlcnZpY2UgaW1wbGVtZW50cyBJSW5zdGFudGlhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc2VydmljZXM6IFNlcnZpY2VDb2xsZWN0aW9uID0gbmV3IFNlcnZpY2VDb2xsZWN0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMuc2V0KElJbnN0YW50aWF0aW9uU2VydmljZSwgdGhpcyk7XG4gIH1cblxuICBwdWJsaWMgc2V0U2VydmljZTxUPihpZDogSVNlcnZpY2VJZGVudGlmaWVyPFQ+LCBpbnN0YW5jZTogVCk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzLnNldChpZCwgaW5zdGFuY2UpO1xuICB9XG5cbiAgcHVibGljIGdldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPik6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlcy5nZXQoaWQpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUluc3RhbmNlPFQ+KGN0b3I6IGFueSwgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICBjb25zdCBzZXJ2aWNlRGVwZW5kZW5jaWVzID0gZ2V0U2VydmljZURlcGVuZGVuY2llcyhjdG9yKS5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlQXJnczogYW55W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2Ygc2VydmljZURlcGVuZGVuY2llcykge1xuICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMuX3NlcnZpY2VzLmdldChkZXBlbmRlbmN5LmlkKTtcbiAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtjcmVhdGVJbnN0YW5jZV0gJHtjdG9yLm5hbWV9IGRlcGVuZHMgb24gVU5LTk9XTiBzZXJ2aWNlICR7ZGVwZW5kZW5jeS5pZH0uYCk7XG4gICAgICB9XG4gICAgICBzZXJ2aWNlQXJncy5wdXNoKHNlcnZpY2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0U2VydmljZUFyZ1BvcyA9IHNlcnZpY2VEZXBlbmRlbmNpZXMubGVuZ3RoID4gMCA/IHNlcnZpY2VEZXBlbmRlbmNpZXNbMF0uaW5kZXggOiBhcmdzLmxlbmd0aDtcblxuICAgIC8vIGNoZWNrIGZvciBhcmd1bWVudCBtaXNtYXRjaGVzLCBhZGp1c3Qgc3RhdGljIGFyZ3MgaWYgbmVlZGVkXG4gICAgaWYgKGFyZ3MubGVuZ3RoICE9PSBmaXJzdFNlcnZpY2VBcmdQb3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW2NyZWF0ZUluc3RhbmNlXSBGaXJzdCBzZXJ2aWNlIGRlcGVuZGVuY3kgb2YgJHtjdG9yLm5hbWV9IGF0IHBvc2l0aW9uICR7Zmlyc3RTZXJ2aWNlQXJnUG9zICsgMX0gY29uZmxpY3RzIHdpdGggJHthcmdzLmxlbmd0aH0gc3RhdGljIGFyZ3VtZW50c2ApO1xuICAgIH1cblxuICAgIC8vIG5vdyBjcmVhdGUgdGhlIGluc3RhbmNlXG4gICAgcmV0dXJuIG5ldyBjdG9yKC4uLlsuLi5hcmdzLCAuLi5zZXJ2aWNlQXJnc10pO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElMb2dTZXJ2aWNlLCBJT3B0aW9uc1NlcnZpY2UsIExvZ0xldmVsRW51bSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbnR5cGUgTG9nVHlwZSA9IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQ7XG5cbmludGVyZmFjZSBJQ29uc29sZSB7XG4gIGxvZzogTG9nVHlwZTtcbiAgZXJyb3I6IExvZ1R5cGU7XG4gIGluZm86IExvZ1R5cGU7XG4gIHRyYWNlOiBMb2dUeXBlO1xuICB3YXJuOiBMb2dUeXBlO1xufVxuXG4vLyBjb25zb2xlIGlzIGF2YWlsYWJsZSBvbiBib3RoIG5vZGUuanMgYW5kIGJyb3dzZXIgY29udGV4dHMgYnV0IHRoZSBjb21tb25cbi8vIG1vZHVsZSBkb2Vzbid0IGRlcGVuZCBvbiB0aGVtIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBkZWNsYXJlIGl0LlxuZGVjbGFyZSBjb25zdCBjb25zb2xlOiBJQ29uc29sZTtcblxuY29uc3Qgb3B0aW9uc0tleVRvTG9nTGV2ZWw6IHsgW2tleTogc3RyaW5nXTogTG9nTGV2ZWxFbnVtIH0gPSB7XG4gIHRyYWNlOiBMb2dMZXZlbEVudW0uVFJBQ0UsXG4gIGRlYnVnOiBMb2dMZXZlbEVudW0uREVCVUcsXG4gIGluZm86IExvZ0xldmVsRW51bS5JTkZPLFxuICB3YXJuOiBMb2dMZXZlbEVudW0uV0FSTixcbiAgZXJyb3I6IExvZ0xldmVsRW51bS5FUlJPUixcbiAgb2ZmOiBMb2dMZXZlbEVudW0uT0ZGXG59O1xuXG5jb25zdCBMT0dfUFJFRklYID0gJ3h0ZXJtLmpzOiAnO1xuXG5leHBvcnQgY2xhc3MgTG9nU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJTG9nU2VydmljZSB7XG4gIHB1YmxpYyBzZXJ2aWNlQnJhbmQ6IGFueTtcblxuICBwcml2YXRlIF9sb2dMZXZlbDogTG9nTGV2ZWxFbnVtID0gTG9nTGV2ZWxFbnVtLk9GRjtcbiAgcHVibGljIGdldCBsb2dMZXZlbCgpOiBMb2dMZXZlbEVudW0geyByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7IH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASU9wdGlvbnNTZXJ2aWNlIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnNTZXJ2aWNlOiBJT3B0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl91cGRhdGVMb2dMZXZlbCgpO1xuICAgIHRoaXMucmVnaXN0ZXIodGhpcy5fb3B0aW9uc1NlcnZpY2Uub25TcGVjaWZpY09wdGlvbkNoYW5nZSgnbG9nTGV2ZWwnLCAoKSA9PiB0aGlzLl91cGRhdGVMb2dMZXZlbCgpKSk7XG5cbiAgICAvLyBGb3IgdHJhY2UgbG9nZ2luZywgYXNzdW1lIHRoZSBsYXRlc3QgY3JlYXRlZCBsb2cgc2VydmljZSBpcyB2YWxpZFxuICAgIHRyYWNlTG9nZ2VyID0gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUxvZ0xldmVsKCk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ0xldmVsID0gb3B0aW9uc0tleVRvTG9nTGV2ZWxbdGhpcy5fb3B0aW9uc1NlcnZpY2UucmF3T3B0aW9ucy5sb2dMZXZlbF07XG4gIH1cblxuICBwcml2YXRlIF9ldmFsTGF6eU9wdGlvbmFsUGFyYW1zKG9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9uYWxQYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uYWxQYXJhbXNbaV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3B0aW9uYWxQYXJhbXNbaV0gPSBvcHRpb25hbFBhcmFtc1tpXSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvZyh0eXBlOiBMb2dUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIHRoaXMuX2V2YWxMYXp5T3B0aW9uYWxQYXJhbXMob3B0aW9uYWxQYXJhbXMpO1xuICAgIHR5cGUuY2FsbChjb25zb2xlLCAodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIgPyAnJyA6IExPR19QUkVGSVgpICsgbWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgcHVibGljIHRyYWNlKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5UUkFDRSkge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy50cmFjZS5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmxvZywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uREVCVUcpIHtcbiAgICAgIHRoaXMuX2xvZyh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcj8uZGVidWcuYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS5sb2csIG1lc3NhZ2UsIG9wdGlvbmFsUGFyYW1zKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2dMZXZlbCA8PSBMb2dMZXZlbEVudW0uSU5GTykge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5pbmZvLmJpbmQodGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXIpID8/IGNvbnNvbGUuaW5mbywgbWVzc2FnZSwgb3B0aW9uYWxQYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5XQVJOKSB7XG4gICAgICB0aGlzLl9sb2codGhpcy5fb3B0aW9uc1NlcnZpY2Uub3B0aW9ucy5sb2dnZXI/Lndhcm4uYmluZCh0aGlzLl9vcHRpb25zU2VydmljZS5vcHRpb25zLmxvZ2dlcikgPz8gY29uc29sZS53YXJuLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvZ0xldmVsIDw9IExvZ0xldmVsRW51bS5FUlJPUikge1xuICAgICAgdGhpcy5fbG9nKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyPy5lcnJvci5iaW5kKHRoaXMuX29wdGlvbnNTZXJ2aWNlLm9wdGlvbnMubG9nZ2VyKSA/PyBjb25zb2xlLmVycm9yLCBtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XG4gICAgfVxuICB9XG59XG5cbmxldCB0cmFjZUxvZ2dlcjogSUxvZ1NlcnZpY2U7XG5leHBvcnQgZnVuY3Rpb24gc2V0VHJhY2VMb2dnZXIobG9nZ2VyOiBJTG9nU2VydmljZSk6IHZvaWQge1xuICB0cmFjZUxvZ2dlciA9IGxvZ2dlcjtcbn1cblxuLyoqXG4gKiBBIGRlY29yYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgbG9nIHRyYWNlIGNhbGxzIHRvIHRoZSBkZWNvcmF0ZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjZUNhbGwoX3RhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzY3JpcHRvcjogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3QgZm5LZXkgPSAndmFsdWUnO1xuICBjb25zdCBmbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gIGRlc2NyaXB0b3JbZm5LZXldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgLy8gRWFybHkgZXhpdFxuICAgIGlmICh0cmFjZUxvZ2dlci5sb2dMZXZlbCAhPT0gTG9nTGV2ZWxFbnVtLlRSQUNFKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuXG4gICAgdHJhY2VMb2dnZXIudHJhY2UoYEdseXBoUmVuZGVyZXIjJHtmbi5uYW1lfSgke2FyZ3MubWFwKGUgPT4gSlNPTi5zdHJpbmdpZnkoZSkpLmpvaW4oJywgJyl9KWApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHRyYWNlTG9nZ2VyLnRyYWNlKGBHbHlwaFJlbmRlcmVyIyR7Zm4ubmFtZX0gcmV0dXJuYCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUsIHRvRGlzcG9zYWJsZSB9IGZyb20gJ2NvbW1vbi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgaXNNYWMgfSBmcm9tICdjb21tb24vUGxhdGZvcm0nO1xuaW1wb3J0IHsgQ3Vyc29yU3R5bGUsIElEaXNwb3NhYmxlIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IEZvbnRXZWlnaHQsIElPcHRpb25zU2VydmljZSwgSVRlcm1pbmFsT3B0aW9ucyB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX09QVElPTlM6IFJlYWRvbmx5PFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+PiA9IHtcbiAgY29sczogODAsXG4gIHJvd3M6IDI0LFxuICBjdXJzb3JCbGluazogZmFsc2UsXG4gIGN1cnNvclN0eWxlOiAnYmxvY2snLFxuICBjdXJzb3JXaWR0aDogMSxcbiAgY3Vyc29ySW5hY3RpdmVTdHlsZTogJ291dGxpbmUnLFxuICBjdXN0b21HbHlwaHM6IHRydWUsXG4gIGRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzOiB0cnVlLFxuICBkb2N1bWVudE92ZXJyaWRlOiBudWxsLFxuICBmYXN0U2Nyb2xsTW9kaWZpZXI6ICdhbHQnLFxuICBmYXN0U2Nyb2xsU2Vuc2l0aXZpdHk6IDUsXG4gIGZvbnRGYW1pbHk6ICdjb3VyaWVyLW5ldywgY291cmllciwgbW9ub3NwYWNlJyxcbiAgZm9udFNpemU6IDE1LFxuICBmb250V2VpZ2h0OiAnbm9ybWFsJyxcbiAgZm9udFdlaWdodEJvbGQ6ICdib2xkJyxcbiAgaWdub3JlQnJhY2tldGVkUGFzdGVNb2RlOiBmYWxzZSxcbiAgbGluZUhlaWdodDogMS4wLFxuICBsZXR0ZXJTcGFjaW5nOiAwLFxuICBsaW5rSGFuZGxlcjogbnVsbCxcbiAgbG9nTGV2ZWw6ICdpbmZvJyxcbiAgbG9nZ2VyOiBudWxsLFxuICBzY3JvbGxiYWNrOiAxMDAwLFxuICBzY3JvbGxPblVzZXJJbnB1dDogdHJ1ZSxcbiAgc2Nyb2xsU2Vuc2l0aXZpdHk6IDEsXG4gIHNjcmVlblJlYWRlck1vZGU6IGZhbHNlLFxuICBzbW9vdGhTY3JvbGxEdXJhdGlvbjogMCxcbiAgbWFjT3B0aW9uSXNNZXRhOiBmYWxzZSxcbiAgbWFjT3B0aW9uQ2xpY2tGb3JjZXNTZWxlY3Rpb246IGZhbHNlLFxuICBtaW5pbXVtQ29udHJhc3RSYXRpbzogMSxcbiAgZGlzYWJsZVN0ZGluOiBmYWxzZSxcbiAgYWxsb3dQcm9wb3NlZEFwaTogZmFsc2UsXG4gIGFsbG93VHJhbnNwYXJlbmN5OiBmYWxzZSxcbiAgdGFiU3RvcFdpZHRoOiA4LFxuICB0aGVtZToge30sXG4gIHJlc2NhbGVPdmVybGFwcGluZ0dseXBoczogZmFsc2UsXG4gIHJpZ2h0Q2xpY2tTZWxlY3RzV29yZDogaXNNYWMsXG4gIHdpbmRvd09wdGlvbnM6IHt9LFxuICB3aW5kb3dzTW9kZTogZmFsc2UsXG4gIHdpbmRvd3NQdHk6IHt9LFxuICB3b3JkU2VwYXJhdG9yOiAnICgpW117fVxcJyxcImAnLFxuICBhbHRDbGlja01vdmVzQ3Vyc29yOiB0cnVlLFxuICBjb252ZXJ0RW9sOiBmYWxzZSxcbiAgdGVybU5hbWU6ICd4dGVybScsXG4gIGNhbmNlbEV2ZW50czogZmFsc2UsXG4gIG92ZXJ2aWV3UnVsZXJXaWR0aDogMFxufTtcblxuY29uc3QgRk9OVF9XRUlHSFRfT1BUSU9OUzogRXh0cmFjdDxGb250V2VpZ2h0LCBzdHJpbmc+W10gPSBbJ25vcm1hbCcsICdib2xkJywgJzEwMCcsICcyMDAnLCAnMzAwJywgJzQwMCcsICc1MDAnLCAnNjAwJywgJzcwMCcsICc4MDAnLCAnOTAwJ107XG5cbmV4cG9ydCBjbGFzcyBPcHRpb25zU2VydmljZSBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJT3B0aW9uc1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJhd09wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuICBwdWJsaWMgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb25PcHRpb25DaGFuZ2UgPSB0aGlzLnJlZ2lzdGVyKG5ldyBFdmVudEVtaXR0ZXI8a2V5b2YgSVRlcm1pbmFsT3B0aW9ucz4oKSk7XG4gIHB1YmxpYyByZWFkb25seSBvbk9wdGlvbkNoYW5nZSA9IHRoaXMuX29uT3B0aW9uQ2hhbmdlLmV2ZW50O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBhcnRpYWw8SVRlcm1pbmFsT3B0aW9ucz4pIHtcbiAgICBzdXBlcigpO1xuICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBlYWNoIG9wdGlvblxuICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0geyAuLi5ERUZBVUxUX09QVElPTlMgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoa2V5IGluIGRlZmF1bHRPcHRpb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBvcHRpb25zW2tleV07XG4gICAgICAgICAgZGVmYXVsdE9wdGlvbnNba2V5XSA9IHRoaXMuX3Nhbml0aXplQW5kVmFsaWRhdGVPcHRpb24oa2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2V0IHVwIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggb3B0aW9uXG4gICAgdGhpcy5yYXdPcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgdGhpcy5vcHRpb25zID0geyAuLi4gZGVmYXVsdE9wdGlvbnMgfTtcbiAgICB0aGlzLl9zZXR1cE9wdGlvbnMoKTtcblxuICAgIC8vIENsZWFyIG91dCBvcHRpb25zIHRoYXQgY291bGQgbGluayBvdXRzaWRlIHh0ZXJtLmpzIGFzIHRoZXkgY291bGQgZWFzaWx5IGNhdXNlIGFuIGVtYmVkZGVyXG4gICAgLy8gbWVtb3J5IGxlYWtcbiAgICB0aGlzLnJlZ2lzdGVyKHRvRGlzcG9zYWJsZSgoKSA9PiB7XG4gICAgICB0aGlzLnJhd09wdGlvbnMubGlua0hhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy5yYXdPcHRpb25zLmRvY3VtZW50T3ZlcnJpZGUgPSBudWxsO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgcHVibGljIG9uU3BlY2lmaWNPcHRpb25DaGFuZ2U8VCBleHRlbmRzIGtleW9mIElUZXJtaW5hbE9wdGlvbnM+KGtleTogVCwgbGlzdGVuZXI6ICh2YWx1ZTogSVRlcm1pbmFsT3B0aW9uc1tUXSkgPT4gYW55KTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLm9uT3B0aW9uQ2hhbmdlKGV2ZW50S2V5ID0+IHtcbiAgICAgIGlmIChldmVudEtleSA9PT0ga2V5KSB7XG4gICAgICAgIGxpc3RlbmVyKHRoaXMucmF3T3B0aW9uc1trZXldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgcHVibGljIG9uTXVsdGlwbGVPcHRpb25DaGFuZ2Uoa2V5czogKGtleW9mIElUZXJtaW5hbE9wdGlvbnMpW10sIGxpc3RlbmVyOiAoKSA9PiBhbnkpOiBJRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMub25PcHRpb25DaGFuZ2UoZXZlbnRLZXkgPT4ge1xuICAgICAgaWYgKGtleXMuaW5kZXhPZihldmVudEtleSkgIT09IC0xKSB7XG4gICAgICAgIGxpc3RlbmVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cE9wdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgZ2V0dGVyID0gKHByb3BOYW1lOiBzdHJpbmcpOiBhbnkgPT4ge1xuICAgICAgaWYgKCEocHJvcE5hbWUgaW4gREVGQVVMVF9PUFRJT05TKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiB3aXRoIGtleSBcIiR7cHJvcE5hbWV9XCJgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJhd09wdGlvbnNbcHJvcE5hbWVdO1xuICAgIH07XG5cbiAgICBjb25zdCBzZXR0ZXIgPSAocHJvcE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCEocHJvcE5hbWUgaW4gREVGQVVMVF9PUFRJT05TKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIG9wdGlvbiB3aXRoIGtleSBcIiR7cHJvcE5hbWV9XCJgKTtcbiAgICAgIH1cblxuICAgICAgdmFsdWUgPSB0aGlzLl9zYW5pdGl6ZUFuZFZhbGlkYXRlT3B0aW9uKHByb3BOYW1lLCB2YWx1ZSk7XG4gICAgICAvLyBEb24ndCBmaXJlIGFuIG9wdGlvbiBjaGFuZ2UgZXZlbnQgaWYgdGhleSBkaWRuJ3QgY2hhbmdlXG4gICAgICBpZiAodGhpcy5yYXdPcHRpb25zW3Byb3BOYW1lXSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5yYXdPcHRpb25zW3Byb3BOYW1lXSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9vbk9wdGlvbkNoYW5nZS5maXJlKHByb3BOYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wTmFtZSBpbiB0aGlzLnJhd09wdGlvbnMpIHtcbiAgICAgIGNvbnN0IGRlc2MgPSB7XG4gICAgICAgIGdldDogZ2V0dGVyLmJpbmQodGhpcywgcHJvcE5hbWUpLFxuICAgICAgICBzZXQ6IHNldHRlci5iaW5kKHRoaXMsIHByb3BOYW1lKVxuICAgICAgfTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLm9wdGlvbnMsIHByb3BOYW1lLCBkZXNjKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zYW5pdGl6ZUFuZFZhbGlkYXRlT3B0aW9uKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSAnY3Vyc29yU3R5bGUnOlxuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgdmFsdWUgPSBERUZBVUxUX09QVElPTlNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQ3Vyc29yU3R5bGUodmFsdWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcIiR7dmFsdWV9XCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yICR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd29yZFNlcGFyYXRvcic6XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICB2YWx1ZSA9IERFRkFVTFRfT1BUSU9OU1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZm9udFdlaWdodCc6XG4gICAgICBjYXNlICdmb250V2VpZ2h0Qm9sZCc6XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIDEgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMTAwMCkge1xuICAgICAgICAgIC8vIGFscmVhZHkgdmFsaWQgbnVtZXJpYyB2YWx1ZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gRk9OVF9XRUlHSFRfT1BUSU9OUy5pbmNsdWRlcyh2YWx1ZSkgPyB2YWx1ZSA6IERFRkFVTFRfT1BUSU9OU1trZXldO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2N1cnNvcldpZHRoJzpcbiAgICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoIGZvciBib3VuZHMgY2hlY2tcbiAgICAgIGNhc2UgJ2xpbmVIZWlnaHQnOlxuICAgICAgY2FzZSAndGFiU3RvcFdpZHRoJzpcbiAgICAgICAgaWYgKHZhbHVlIDwgMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGNhbm5vdCBiZSBsZXNzIHRoYW4gMSwgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtaW5pbXVtQ29udHJhc3RSYXRpbyc6XG4gICAgICAgIHZhbHVlID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIE1hdGgucm91bmQodmFsdWUgKiAxMCkgLyAxMCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Njcm9sbGJhY2snOlxuICAgICAgICB2YWx1ZSA9IE1hdGgubWluKHZhbHVlLCA0Mjk0OTY3Mjk1KTtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGNhbm5vdCBiZSBsZXNzIHRoYW4gMCwgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmYXN0U2Nyb2xsU2Vuc2l0aXZpdHknOlxuICAgICAgY2FzZSAnc2Nyb2xsU2Vuc2l0aXZpdHknOlxuICAgICAgICBpZiAodmFsdWUgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGNhbm5vdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMCwgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyb3dzJzpcbiAgICAgIGNhc2UgJ2NvbHMnOlxuICAgICAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gbXVzdCBiZSBudW1lcmljLCB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dpbmRvd3NQdHknOlxuICAgICAgICB2YWx1ZSA9IHZhbHVlID8/IHt9O1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ3Vyc29yU3R5bGUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDdXJzb3JTdHlsZSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gJ2Jsb2NrJyB8fCB2YWx1ZSA9PT0gJ3VuZGVybGluZScgfHwgdmFsdWUgPT09ICdiYXInO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjIgVGhlIHh0ZXJtLmpzIGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuaW1wb3J0IHsgSUJ1ZmZlclNlcnZpY2UsIElPc2NMaW5rU2VydmljZSB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlcyc7XG5pbXBvcnQgeyBJTWFya2VyLCBJT3NjTGlua0RhdGEgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgT3NjTGlua1NlcnZpY2UgaW1wbGVtZW50cyBJT3NjTGlua1NlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfbmV4dElkID0gMTtcblxuICAvKipcbiAgICogQSBtYXAgb2YgdGhlIGxpbmsga2V5IHRvIGxpbmsgZW50cnkuIFRoaXMgaXMgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBsaW5lcyB0byBsaW5rcyB3aXRoIGlkcy5cbiAgICovXG4gIHByaXZhdGUgX2VudHJpZXNXaXRoSWQ6IE1hcDxzdHJpbmcsIElPc2NMaW5rRW50cnlXaXRoSWQ+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiB0aGUgbGluayBpZCB0byB0aGUgbGluayBlbnRyeS4gVGhlIFwibGluayBpZFwiIChudW1iZXIpIHdoaWNoIGlzIHRoZSBudW1iZXJpY1xuICAgKiByZXByZXNlbnRhdGlvbiBvZiBhIHVuaXF1ZSBsaW5rIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCBcImlkXCIgKHN0cmluZykgd2hpY2ggY29tZXMgaW4gd2l0aFxuICAgKiBgaWQ9YCBpbiB0aGUgT1NDIGxpbmsncyBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfZGF0YUJ5TGlua0lkOiBNYXA8bnVtYmVyLCBJT3NjTGlua0VudHJ5Tm9JZCB8IElPc2NMaW5rRW50cnlXaXRoSWQ+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJQnVmZmVyU2VydmljZSBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXJTZXJ2aWNlOiBJQnVmZmVyU2VydmljZVxuICApIHtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckxpbmsoZGF0YTogSU9zY0xpbmtEYXRhKTogbnVtYmVyIHtcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlcjtcblxuICAgIC8vIExpbmtzIHdpdGggbm8gaWQgd2lsbCBvbmx5IGV2ZXIgYmUgcmVnaXN0ZXJlZCBhIHNpbmdsZSB0aW1lXG4gICAgaWYgKGRhdGEuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWFya2VyID0gYnVmZmVyLmFkZE1hcmtlcihidWZmZXIueWJhc2UgKyBidWZmZXIueSk7XG4gICAgICBjb25zdCBlbnRyeTogSU9zY0xpbmtFbnRyeU5vSWQgPSB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGlkOiB0aGlzLl9uZXh0SWQrKyxcbiAgICAgICAgbGluZXM6IFttYXJrZXJdXG4gICAgICB9O1xuICAgICAgbWFya2VyLm9uRGlzcG9zZSgoKSA9PiB0aGlzLl9yZW1vdmVNYXJrZXJGcm9tTGluayhlbnRyeSwgbWFya2VyKSk7XG4gICAgICB0aGlzLl9kYXRhQnlMaW5rSWQuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgICByZXR1cm4gZW50cnkuaWQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBsaW5lIHRvIHRoZSBsaW5rIGlmIGl0IGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgY2FzdERhdGEgPSBkYXRhIGFzIFJlcXVpcmVkPElPc2NMaW5rRGF0YT47XG4gICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0RW50cnlJZEtleShjYXN0RGF0YSk7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLl9lbnRyaWVzV2l0aElkLmdldChrZXkpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgdGhpcy5hZGRMaW5lVG9MaW5rKG1hdGNoLmlkLCBidWZmZXIueWJhc2UgKyBidWZmZXIueSk7XG4gICAgICByZXR1cm4gbWF0Y2guaWQ7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBsaW5rXG4gICAgY29uc3QgbWFya2VyID0gYnVmZmVyLmFkZE1hcmtlcihidWZmZXIueWJhc2UgKyBidWZmZXIueSk7XG4gICAgY29uc3QgZW50cnk6IElPc2NMaW5rRW50cnlXaXRoSWQgPSB7XG4gICAgICBpZDogdGhpcy5fbmV4dElkKyssXG4gICAgICBrZXk6IHRoaXMuX2dldEVudHJ5SWRLZXkoY2FzdERhdGEpLFxuICAgICAgZGF0YTogY2FzdERhdGEsXG4gICAgICBsaW5lczogW21hcmtlcl1cbiAgICB9O1xuICAgIG1hcmtlci5vbkRpc3Bvc2UoKCkgPT4gdGhpcy5fcmVtb3ZlTWFya2VyRnJvbUxpbmsoZW50cnksIG1hcmtlcikpO1xuICAgIHRoaXMuX2VudHJpZXNXaXRoSWQuc2V0KGVudHJ5LmtleSwgZW50cnkpO1xuICAgIHRoaXMuX2RhdGFCeUxpbmtJZC5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnkuaWQ7XG4gIH1cblxuICBwdWJsaWMgYWRkTGluZVRvTGluayhsaW5rSWQ6IG51bWJlciwgeTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9kYXRhQnlMaW5rSWQuZ2V0KGxpbmtJZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZW50cnkubGluZXMuZXZlcnkoZSA9PiBlLmxpbmUgIT09IHkpKSB7XG4gICAgICBjb25zdCBtYXJrZXIgPSB0aGlzLl9idWZmZXJTZXJ2aWNlLmJ1ZmZlci5hZGRNYXJrZXIoeSk7XG4gICAgICBlbnRyeS5saW5lcy5wdXNoKG1hcmtlcik7XG4gICAgICBtYXJrZXIub25EaXNwb3NlKCgpID0+IHRoaXMuX3JlbW92ZU1hcmtlckZyb21MaW5rKGVudHJ5LCBtYXJrZXIpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0TGlua0RhdGEobGlua0lkOiBudW1iZXIpOiBJT3NjTGlua0RhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhQnlMaW5rSWQuZ2V0KGxpbmtJZCk/LmRhdGE7XG4gIH1cblxuICBwcml2YXRlIF9nZXRFbnRyeUlkS2V5KGxpbmtEYXRhOiBSZXF1aXJlZDxJT3NjTGlua0RhdGE+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7bGlua0RhdGEuaWR9Ozske2xpbmtEYXRhLnVyaX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlTWFya2VyRnJvbUxpbmsoZW50cnk6IElPc2NMaW5rRW50cnlOb0lkIHwgSU9zY0xpbmtFbnRyeVdpdGhJZCwgbWFya2VyOiBJTWFya2VyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSBlbnRyeS5saW5lcy5pbmRleE9mKG1hcmtlcik7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5saW5lcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyeS5saW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChlbnRyeS5kYXRhLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fZW50cmllc1dpdGhJZC5kZWxldGUoKGVudHJ5IGFzIElPc2NMaW5rRW50cnlXaXRoSWQpLmtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9kYXRhQnlMaW5rSWQuZGVsZXRlKGVudHJ5LmlkKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIElPc2NMaW5rRW50cnk8VCBleHRlbmRzIElPc2NMaW5rRGF0YT4ge1xuICBkYXRhOiBUO1xuICBpZDogbnVtYmVyO1xuICBsaW5lczogSU1hcmtlcltdO1xufVxuXG5pbnRlcmZhY2UgSU9zY0xpbmtFbnRyeU5vSWQgZXh0ZW5kcyBJT3NjTGlua0VudHJ5PElPc2NMaW5rRGF0YT4ge1xufVxuXG5pbnRlcmZhY2UgSU9zY0xpbmtFbnRyeVdpdGhJZCBleHRlbmRzIElPc2NMaW5rRW50cnk8UmVxdWlyZWQ8SU9zY0xpbmtEYXRhPj4ge1xuICBrZXk6IHN0cmluZztcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKlxuICogVGhpcyB3YXMgaGVhdmlseSBpbnNwaXJlZCBmcm9tIG1pY3Jvc29mdC92c2NvZGUncyBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0gKE1JVCkuXG4gKi9cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5pbXBvcnQgeyBJU2VydmljZUlkZW50aWZpZXIgfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5jb25zdCBESV9UQVJHRVQgPSAnZGkkdGFyZ2V0JztcbmNvbnN0IERJX0RFUEVOREVOQ0lFUyA9ICdkaSRkZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY29uc3Qgc2VydmljZVJlZ2lzdHJ5OiBNYXA8c3RyaW5nLCBJU2VydmljZUlkZW50aWZpZXI8YW55Pj4gPSBuZXcgTWFwKCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzKGN0b3I6IGFueSk6IHsgaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxhbnk+LCBpbmRleDogbnVtYmVyLCBvcHRpb25hbDogYm9vbGVhbiB9W10ge1xuICByZXR1cm4gY3RvcltESV9ERVBFTkRFTkNJRVNdIHx8IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVjb3JhdG9yPFQ+KGlkOiBzdHJpbmcpOiBJU2VydmljZUlkZW50aWZpZXI8VD4ge1xuICBpZiAoc2VydmljZVJlZ2lzdHJ5LmhhcyhpZCkpIHtcbiAgICByZXR1cm4gc2VydmljZVJlZ2lzdHJ5LmdldChpZCkhO1xuICB9XG5cbiAgY29uc3QgZGVjb3JhdG9yOiBhbnkgPSBmdW5jdGlvbiAodGFyZ2V0OiBGdW5jdGlvbiwga2V5OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BJU2VydmljZU5hbWUtZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVjb3JhdGUgYSBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGRlY29yYXRvciwgdGFyZ2V0LCBpbmRleCk7XG4gIH07XG5cbiAgZGVjb3JhdG9yLnRvU3RyaW5nID0gKCkgPT4gaWQ7XG5cbiAgc2VydmljZVJlZ2lzdHJ5LnNldChpZCwgZGVjb3JhdG9yKTtcbiAgcmV0dXJuIGRlY29yYXRvcjtcbn1cblxuZnVuY3Rpb24gc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZDogRnVuY3Rpb24sIHRhcmdldDogRnVuY3Rpb24sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKCh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID09PSB0YXJnZXQpIHtcbiAgICAodGFyZ2V0IGFzIGFueSlbRElfREVQRU5ERU5DSUVTXS5wdXNoKHsgaWQsIGluZGV4IH0pO1xuICB9IGVsc2Uge1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9ERVBFTkRFTkNJRVNdID0gW3sgaWQsIGluZGV4IH1dO1xuICAgICh0YXJnZXQgYXMgYW55KVtESV9UQVJHRVRdID0gdGFyZ2V0O1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IElFdmVudCwgSUV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgSUJ1ZmZlciwgSUJ1ZmZlclNldCB9IGZyb20gJ2NvbW1vbi9idWZmZXIvVHlwZXMnO1xuaW1wb3J0IHsgSURlY1ByaXZhdGVNb2RlcywgSUNvcmVNb3VzZUV2ZW50LCBDb3JlTW91c2VFbmNvZGluZywgSUNvcmVNb3VzZVByb3RvY29sLCBDb3JlTW91c2VFdmVudFR5cGUsIElDaGFyc2V0LCBJV2luZG93T3B0aW9ucywgSU1vZGVzLCBJQXR0cmlidXRlRGF0YSwgU2Nyb2xsU291cmNlLCBJRGlzcG9zYWJsZSwgSUNvbG9yLCBDdXJzb3JTdHlsZSwgQ3Vyc29ySW5hY3RpdmVTdHlsZSwgSU9zY0xpbmtEYXRhIH0gZnJvbSAnY29tbW9uL1R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZURlY29yYXRvciB9IGZyb20gJ2NvbW1vbi9zZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgSURlY29yYXRpb25PcHRpb25zLCBJRGVjb3JhdGlvbiwgSUxpbmtIYW5kbGVyLCBJV2luZG93c1B0eSwgSUxvZ2dlciB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbmV4cG9ydCBjb25zdCBJQnVmZmVyU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQnVmZmVyU2VydmljZT4oJ0J1ZmZlclNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUJ1ZmZlclNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICByZWFkb25seSBjb2xzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHJvd3M6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnVmZmVyOiBJQnVmZmVyO1xuICByZWFkb25seSBidWZmZXJzOiBJQnVmZmVyU2V0O1xuICBpc1VzZXJTY3JvbGxpbmc6IGJvb2xlYW47XG4gIG9uUmVzaXplOiBJRXZlbnQ8eyBjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlciB9PjtcbiAgb25TY3JvbGw6IElFdmVudDxudW1iZXI+O1xuICBzY3JvbGwoZXJhc2VBdHRyOiBJQXR0cmlidXRlRGF0YSwgaXNXcmFwcGVkPzogYm9vbGVhbik6IHZvaWQ7XG4gIHNjcm9sbExpbmVzKGRpc3A6IG51bWJlciwgc3VwcHJlc3NTY3JvbGxFdmVudD86IGJvb2xlYW4sIHNvdXJjZT86IFNjcm9sbFNvdXJjZSk6IHZvaWQ7XG4gIHJlc2l6ZShjb2xzOiBudW1iZXIsIHJvd3M6IG51bWJlcik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJQ29yZU1vdXNlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ29yZU1vdXNlU2VydmljZT4oJ0NvcmVNb3VzZVNlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSUNvcmVNb3VzZVNlcnZpY2Uge1xuICBhY3RpdmVQcm90b2NvbDogc3RyaW5nO1xuICBhY3RpdmVFbmNvZGluZzogc3RyaW5nO1xuICBhcmVNb3VzZUV2ZW50c0FjdGl2ZTogYm9vbGVhbjtcbiAgYWRkUHJvdG9jb2wobmFtZTogc3RyaW5nLCBwcm90b2NvbDogSUNvcmVNb3VzZVByb3RvY29sKTogdm9pZDtcbiAgYWRkRW5jb2RpbmcobmFtZTogc3RyaW5nLCBlbmNvZGluZzogQ29yZU1vdXNlRW5jb2RpbmcpOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG1vdXNlIGV2ZW50IHRvIGJlIHNlbnQuXG4gICAqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQgcGFzc2VkIGFsbCBwcm90b2NvbCByZXN0cmljdGlvbnMgYW5kIGEgcmVwb3J0XG4gICAqIHdhcyBzZW50LCBvdGhlcndpc2UgZmFsc2UuIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXJcbiAgICogdGhlIGRlZmF1bHQgZXZlbnQgYWN0aW9uIGluIHRoZSBib3dzZXIgY29tcG9uZW50IHNob3VsZCBiZSBvbWl0dGVkLlxuICAgKlxuICAgKiBOb3RlOiBUaGUgbWV0aG9kIHdpbGwgY2hhbmdlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gZXZlbnQgb2JqZWN0XG4gICAqIHRvIGZ1bGxmaWxsIHByb3RvY29sIGFuZCBlbmNvZGluZyByZXN0cmljdGlvbnMuXG4gICAqL1xuICB0cmlnZ2VyTW91c2VFdmVudChldmVudDogSUNvcmVNb3VzZUV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXZlbnQgdG8gYW5ub3VuY2UgY2hhbmdlcyBpbiBtb3VzZSB0cmFja2luZy5cbiAgICovXG4gIG9uUHJvdG9jb2xDaGFuZ2U6IElFdmVudDxDb3JlTW91c2VFdmVudFR5cGU+O1xuXG4gIC8qKlxuICAgKiBIdW1hbiByZWFkYWJsZSB2ZXJzaW9uIG9mIG1vdXNlIGV2ZW50cy5cbiAgICovXG4gIGV4cGxhaW5FdmVudHMoZXZlbnRzOiBDb3JlTW91c2VFdmVudFR5cGUpOiB7IFtldmVudDogc3RyaW5nXTogYm9vbGVhbiB9O1xufVxuXG5leHBvcnQgY29uc3QgSUNvcmVTZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElDb3JlU2VydmljZT4oJ0NvcmVTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElDb3JlU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsbHkgdGhlIGN1cnNvciB3aWxsIG5vdCBiZSB2aXNpYmxlIHVudGlsIHRoZSBmaXJzdCB0aW1lIHRoZSB0ZXJtaW5hbFxuICAgKiBpcyBmb2N1c2VkLlxuICAgKi9cbiAgaXNDdXJzb3JJbml0aWFsaXplZDogYm9vbGVhbjtcbiAgaXNDdXJzb3JIaWRkZW46IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkgbW9kZXM6IElNb2RlcztcbiAgcmVhZG9ubHkgZGVjUHJpdmF0ZU1vZGVzOiBJRGVjUHJpdmF0ZU1vZGVzO1xuXG4gIHJlYWRvbmx5IG9uRGF0YTogSUV2ZW50PHN0cmluZz47XG4gIHJlYWRvbmx5IG9uVXNlcklucHV0OiBJRXZlbnQ8dm9pZD47XG4gIHJlYWRvbmx5IG9uQmluYXJ5OiBJRXZlbnQ8c3RyaW5nPjtcbiAgcmVhZG9ubHkgb25SZXF1ZXN0U2Nyb2xsVG9Cb3R0b206IElFdmVudDx2b2lkPjtcblxuICByZXNldCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyB0aGUgb25EYXRhIGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqIEBwYXJhbSB3YXNVc2VySW5wdXQgV2hldGhlciB0aGUgZGF0YSBvcmlnaW5hdGVkIGZyb20gdGhlIHVzZXIgKGFzIG9wcG9zZWQgdG9cbiAgICogcmVzdWx0aW5nIGZyb20gcGFyc2luZyBpbmNvbWluZyBkYXRhKS4gV2hlbiB0cnVlIHRoaXMgd2lsbCBhbHNvOlxuICAgKiAtIFNjcm9sbCB0byB0aGUgYm90dG9tIG9mIHRoZSBidWZmZXIgaWYgb3B0aW9uIHNjcm9sbE9uVXNlcklucHV0IGlzIHRydWUuXG4gICAqIC0gRmlyZSB0aGUgYG9uVXNlcklucHV0YCBldmVudCAoc28gc2VsZWN0aW9uIGNhbiBiZSBjbGVhcmVkKS5cbiAgICovXG4gIHRyaWdnZXJEYXRhRXZlbnQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ/OiBib29sZWFuKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIG9uQmluYXJ5IGV2ZW50IGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IGlzIGJlaW5nIGVtaXR0ZWQuXG4gICAqL1xuICB0cmlnZ2VyQmluYXJ5RXZlbnQoZGF0YTogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IElDaGFyc2V0U2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJQ2hhcnNldFNlcnZpY2U+KCdDaGFyc2V0U2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJQ2hhcnNldFNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcblxuICBjaGFyc2V0OiBJQ2hhcnNldCB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZ2xldmVsOiBudW1iZXI7XG5cbiAgcmVzZXQoKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICovXG4gIHNldGdMZXZlbChnOiBudW1iZXIpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNoYXJzZXQgZm9yIHRoZSBnaXZlbiBHIGxldmVsIG9mIHRoZSB0ZXJtaW5hbC5cbiAgICogQHBhcmFtIGdcbiAgICogQHBhcmFtIGNoYXJzZXRcbiAgICovXG4gIHNldGdDaGFyc2V0KGc6IG51bWJlciwgY2hhcnNldDogSUNoYXJzZXQgfCB1bmRlZmluZWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTZXJ2aWNlSWRlbnRpZmllcjxUPiB7XG4gICguLi5hcmdzOiBhbnlbXSk6IHZvaWQ7XG4gIHR5cGU6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJyYW5kZWRTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG59XG5cbnR5cGUgR2V0TGVhZGluZ05vblNlcnZpY2VBcmdzPFRBcmdzIGV4dGVuZHMgYW55W10+ID0gVEFyZ3MgZXh0ZW5kcyBbXSA/IFtdXG4gIDogVEFyZ3MgZXh0ZW5kcyBbLi4uaW5mZXIgVEZpcnN0LCBpbmZlciBUTGFzdF0gPyBUTGFzdCBleHRlbmRzIElCcmFuZGVkU2VydmljZSA/IEdldExlYWRpbmdOb25TZXJ2aWNlQXJnczxURmlyc3Q+IDogVEFyZ3NcbiAgICA6IG5ldmVyO1xuXG5leHBvcnQgY29uc3QgSUluc3RhbnRpYXRpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElJbnN0YW50aWF0aW9uU2VydmljZT4oJ0luc3RhbnRpYXRpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uU2VydmljZSB7XG4gIHNlcnZpY2VCcmFuZDogdW5kZWZpbmVkO1xuXG4gIHNldFNlcnZpY2U8VD4oaWQ6IElTZXJ2aWNlSWRlbnRpZmllcjxUPiwgaW5zdGFuY2U6IFQpOiB2b2lkO1xuICBnZXRTZXJ2aWNlPFQ+KGlkOiBJU2VydmljZUlkZW50aWZpZXI8VD4pOiBUIHwgdW5kZWZpbmVkO1xuICBjcmVhdGVJbnN0YW5jZTxDdG9yIGV4dGVuZHMgbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBSIGV4dGVuZHMgSW5zdGFuY2VUeXBlPEN0b3I+Pih0OiBDdG9yLCAuLi5hcmdzOiBHZXRMZWFkaW5nTm9uU2VydmljZUFyZ3M8Q29uc3RydWN0b3JQYXJhbWV0ZXJzPEN0b3I+Pik6IFI7XG59XG5cbmV4cG9ydCBlbnVtIExvZ0xldmVsRW51bSB7XG4gIFRSQUNFID0gMCxcbiAgREVCVUcgPSAxLFxuICBJTkZPID0gMixcbiAgV0FSTiA9IDMsXG4gIEVSUk9SID0gNCxcbiAgT0ZGID0gNVxufVxuXG5leHBvcnQgY29uc3QgSUxvZ1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SUxvZ1NlcnZpY2U+KCdMb2dTZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElMb2dTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgbG9nTGV2ZWw6IExvZ0xldmVsRW51bTtcblxuICB0cmFjZShtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgaW5mbyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBJT3B0aW9uc1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU9wdGlvbnNTZXJ2aWNlPignT3B0aW9uc1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU9wdGlvbnNTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJlYWQgb25seSBhY2Nlc3MgdG8gdGhlIHJhdyBvcHRpb25zIG9iamVjdCwgdGhpcyBpcyBhbiBpbnRlcm5hbC1vbmx5IGZhc3QgcGF0aCBmb3IgYWNjZXNzaW5nXG4gICAqIHNpbmdsZSBvcHRpb25zIHdpdGhvdXQgYW55IHZhbGlkYXRpb24gYXMgd2UgdHJ1c3QgVHlwZVNjcmlwdCB0byBlbmZvcmNlIGNvcnJlY3QgdXNhZ2VcbiAgICogaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IHJhd09wdGlvbnM6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+O1xuXG4gIC8qKlxuICAgKiBPcHRpb25zIGFzIGV4cG9zZWQgdGhyb3VnaCB0aGUgcHVibGljIEFQSSwgdGhpcyBwcm9wZXJ0eSB1c2VzIGdldHRlcnMgYW5kIHNldHRlcnMgd2l0aFxuICAgKiB2YWxpZGF0aW9uIHdoaWNoIG1ha2VzIGl0IHNhZmVyIGJ1dCBzbG93ZXIuIHtAbGluayByYXdPcHRpb25zfSBzaG91bGQgYmUgdXNlZCBmb3IgcHJldHR5IG11Y2hcbiAgICogYWxsIGludGVybmFsIHVzYWdlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz47XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgZm9yIHdoZW4gYW55IG9wdGlvbiBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgb25PcHRpb25DaGFuZ2U6IElFdmVudDxrZXlvZiBJVGVybWluYWxPcHRpb25zPjtcblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBmb3Igd2hlbiBhIHNwZWNpZmljIG9wdGlvbiBjaGFuZ2VzLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaXNcbiAgICogcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG9ubHkgYSBzaW5nbGUgb3B0aW9uIGlzIGJlaW5nIGxpc3RlbmVkIHRvLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICBvblNwZWNpZmljT3B0aW9uQ2hhbmdlPFQgZXh0ZW5kcyBrZXlvZiBJVGVybWluYWxPcHRpb25zPihrZXk6IFQsIGxpc3RlbmVyOiAoYXJnMTogUmVxdWlyZWQ8SVRlcm1pbmFsT3B0aW9ucz5bVF0pID0+IGFueSk6IElEaXNwb3NhYmxlO1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGZvciB3aGVuIGEgc2V0IG9mIHNwZWNpZmljIG9wdGlvbnMgY2hhbmdlLCB0aGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kXG4gICAqIHRoYXQgaXMgcHJlZmVycmVkIG92ZXIge0BsaW5rIG9uT3B0aW9uQ2hhbmdlfSB3aGVuIG11bHRpcGxlIG9wdGlvbnMgYXJlIGJlaW5nIGxpc3RlbmVkIHRvIGFuZFxuICAgKiBoYW5kbGVkIHRoZSBzYW1lIHdheS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgb25NdWx0aXBsZU9wdGlvbkNoYW5nZShrZXlzOiAoa2V5b2YgSVRlcm1pbmFsT3B0aW9ucylbXSwgbGlzdGVuZXI6ICgpID0+IGFueSk6IElEaXNwb3NhYmxlO1xufVxuXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0ID0gJ25vcm1hbCcgfCAnYm9sZCcgfCAnMTAwJyB8ICcyMDAnIHwgJzMwMCcgfCAnNDAwJyB8ICc1MDAnIHwgJzYwMCcgfCAnNzAwJyB8ICc4MDAnIHwgJzkwMCcgfCBudW1iZXI7XG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdvZmYnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUZXJtaW5hbE9wdGlvbnMge1xuICBhbGxvd1Byb3Bvc2VkQXBpPzogYm9vbGVhbjtcbiAgYWxsb3dUcmFuc3BhcmVuY3k/OiBib29sZWFuO1xuICBhbHRDbGlja01vdmVzQ3Vyc29yPzogYm9vbGVhbjtcbiAgY29scz86IG51bWJlcjtcbiAgY29udmVydEVvbD86IGJvb2xlYW47XG4gIGN1cnNvckJsaW5rPzogYm9vbGVhbjtcbiAgY3Vyc29yU3R5bGU/OiBDdXJzb3JTdHlsZTtcbiAgY3Vyc29yV2lkdGg/OiBudW1iZXI7XG4gIGN1cnNvckluYWN0aXZlU3R5bGU/OiBDdXJzb3JJbmFjdGl2ZVN0eWxlO1xuICBjdXN0b21HbHlwaHM/OiBib29sZWFuO1xuICBkaXNhYmxlU3RkaW4/OiBib29sZWFuO1xuICBkb2N1bWVudE92ZXJyaWRlPzogYW55IHwgbnVsbDtcbiAgZHJhd0JvbGRUZXh0SW5CcmlnaHRDb2xvcnM/OiBib29sZWFuO1xuICBmYXN0U2Nyb2xsTW9kaWZpZXI/OiAnbm9uZScgfCAnYWx0JyB8ICdjdHJsJyB8ICdzaGlmdCc7XG4gIGZhc3RTY3JvbGxTZW5zaXRpdml0eT86IG51bWJlcjtcbiAgZm9udFNpemU/OiBudW1iZXI7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIGZvbnRXZWlnaHQ/OiBGb250V2VpZ2h0O1xuICBmb250V2VpZ2h0Qm9sZD86IEZvbnRXZWlnaHQ7XG4gIGlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZT86IGJvb2xlYW47XG4gIGxldHRlclNwYWNpbmc/OiBudW1iZXI7XG4gIGxpbmVIZWlnaHQ/OiBudW1iZXI7XG4gIGxpbmtIYW5kbGVyPzogSUxpbmtIYW5kbGVyIHwgbnVsbDtcbiAgbG9nTGV2ZWw/OiBMb2dMZXZlbDtcbiAgbG9nZ2VyPzogSUxvZ2dlciB8IG51bGw7XG4gIG1hY09wdGlvbklzTWV0YT86IGJvb2xlYW47XG4gIG1hY09wdGlvbkNsaWNrRm9yY2VzU2VsZWN0aW9uPzogYm9vbGVhbjtcbiAgbWluaW11bUNvbnRyYXN0UmF0aW8/OiBudW1iZXI7XG4gIHJlc2NhbGVPdmVybGFwcGluZ0dseXBocz86IGJvb2xlYW47XG4gIHJpZ2h0Q2xpY2tTZWxlY3RzV29yZD86IGJvb2xlYW47XG4gIHJvd3M/OiBudW1iZXI7XG4gIHNjcmVlblJlYWRlck1vZGU/OiBib29sZWFuO1xuICBzY3JvbGxiYWNrPzogbnVtYmVyO1xuICBzY3JvbGxPblVzZXJJbnB1dD86IGJvb2xlYW47XG4gIHNjcm9sbFNlbnNpdGl2aXR5PzogbnVtYmVyO1xuICBzbW9vdGhTY3JvbGxEdXJhdGlvbj86IG51bWJlcjtcbiAgdGFiU3RvcFdpZHRoPzogbnVtYmVyO1xuICB0aGVtZT86IElUaGVtZTtcbiAgd2luZG93c01vZGU/OiBib29sZWFuO1xuICB3aW5kb3dzUHR5PzogSVdpbmRvd3NQdHk7XG4gIHdpbmRvd09wdGlvbnM/OiBJV2luZG93T3B0aW9ucztcbiAgd29yZFNlcGFyYXRvcj86IHN0cmluZztcbiAgb3ZlcnZpZXdSdWxlcldpZHRoPzogbnVtYmVyO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgY2FuY2VsRXZlbnRzOiBib29sZWFuO1xuICB0ZXJtTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUaGVtZSB7XG4gIGZvcmVncm91bmQ/OiBzdHJpbmc7XG4gIGJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGN1cnNvcj86IHN0cmluZztcbiAgY3Vyc29yQWNjZW50Pzogc3RyaW5nO1xuICBzZWxlY3Rpb25Gb3JlZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25CYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGJsYWNrPzogc3RyaW5nO1xuICByZWQ/OiBzdHJpbmc7XG4gIGdyZWVuPzogc3RyaW5nO1xuICB5ZWxsb3c/OiBzdHJpbmc7XG4gIGJsdWU/OiBzdHJpbmc7XG4gIG1hZ2VudGE/OiBzdHJpbmc7XG4gIGN5YW4/OiBzdHJpbmc7XG4gIHdoaXRlPzogc3RyaW5nO1xuICBicmlnaHRCbGFjaz86IHN0cmluZztcbiAgYnJpZ2h0UmVkPzogc3RyaW5nO1xuICBicmlnaHRHcmVlbj86IHN0cmluZztcbiAgYnJpZ2h0WWVsbG93Pzogc3RyaW5nO1xuICBicmlnaHRCbHVlPzogc3RyaW5nO1xuICBicmlnaHRNYWdlbnRhPzogc3RyaW5nO1xuICBicmlnaHRDeWFuPzogc3RyaW5nO1xuICBicmlnaHRXaGl0ZT86IHN0cmluZztcbiAgZXh0ZW5kZWRBbnNpPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBJT3NjTGlua1NlcnZpY2UgPSBjcmVhdGVEZWNvcmF0b3I8SU9zY0xpbmtTZXJ2aWNlPignT3NjTGlua1NlcnZpY2UnKTtcbmV4cG9ydCBpbnRlcmZhY2UgSU9zY0xpbmtTZXJ2aWNlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBsaW5rIHRvIHRoZSBzZXJ2aWNlLCByZXR1cm5pbmcgdGhlIGxpbmsgSUQuIFRoZSBsaW5rIGRhdGEgaXMgbWFuYWdlZCBieSB0aGlzXG4gICAqIHNlcnZpY2UgYW5kIHdpbGwgYmUgZnJlZWQgd2hlbiB0aGlzIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGlzIHRyaW1tZWQgb2ZmIHRoZSBidWZmZXIuXG4gICAqL1xuICByZWdpc3RlckxpbmsobGlua0RhdGE6IElPc2NMaW5rRGF0YSk6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFkZHMgYSBsaW5lIHRvIGEgbGluayBpZiBuZWVkZWQuXG4gICAqL1xuICBhZGRMaW5lVG9MaW5rKGxpbmtJZDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkO1xuICAvKiogR2V0IHRoZSBsaW5rIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgbGluayBJRC4gKi9cbiAgZ2V0TGlua0RhdGEobGlua0lkOiBudW1iZXIpOiBJT3NjTGlua0RhdGEgfCB1bmRlZmluZWQ7XG59XG5cbi8qXG4gKiBXaWR0aCBhbmQgR3JhcGhlbWVfQ2x1c3Rlcl9CcmVhayBwcm9wZXJ0aWVzIG9mIGEgY2hhcmFjdGVyIGFzIGEgYml0IG1hc2suXG4gKlxuICogYml0IDA6IHNob3VsZEpvaW4gLSBzaG91bGQgY29tYmluZSB3aXRoIHByZWNlZGluZyBjaGFyYWN0ZXIuXG4gKiBiaXQgMS4uMjogd2N3aWR0aCAtIHNlZSBVbmljb2RlQ2hhcldpZHRoLlxuICogYml0IDMuLjMxOiBjbGFzcyBvZiBjaGFyYWN0ZXIgKGN1cnJlbnRseSBvbmx5IDQgYml0cyBhcmUgdXNlZCkuXG4gKiAgIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmVkIGdyYXBoZW1lIGNsdXN0ZXJpbmcgLSBpLmUuIHdoaWNoIGNvZGVwb2ludHNcbiAqICAgYXJlIHRvIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgY29tcG91bmQgY2hhcmFjdGVyLlxuICpcbiAqIFVzZSB0aGUgVW5pY29kZVNlcnZpY2Ugc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5VmFsdWUgdG8gY3JlYXRlIGFcbiAqIFVuaWNvZGVDaGFyUHJvcGVydGllczsgdXNlIGV4dHJhY3RTaG91bGRKb2luLCBleHRyYWN0V2lkdGgsIGFuZFxuICogZXh0cmFjdENoYXJLaW5kIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFVuaWNvZGVDaGFyUHJvcGVydGllcyA9IG51bWJlcjtcblxuLyoqXG4gKiBXaWR0aCBpbiBjb2x1bW5zIG9mIGEgY2hhcmFjdGVyLlxuICogSW4gYSBDSksgY29udGV4dCwgXCJoYWxmLXdpZHRoXCIgY2hhcmFjdGVycyAoc3VjaCBhcyBMYXRpbikgYXJlIHdpZHRoIDEsXG4gKiB3aGlsZSBcImZ1bGwtd2lkdGhcIiBjaGFyYWN0ZXJzIChzdWNoIGFzIEthbmppKSBhcmUgMiBjb2x1bW5zIHdpZGUuXG4gKiBDb21iaW5pbmcgY2hhcmFjdGVycyAoc3VjaCBhcyBhY2NlbnRzKSBhcmUgd2lkdGggMC5cbiAqL1xuZXhwb3J0IHR5cGUgVW5pY29kZUNoYXJXaWR0aCA9IDAgfCAxIHwgMjtcblxuZXhwb3J0IGNvbnN0IElVbmljb2RlU2VydmljZSA9IGNyZWF0ZURlY29yYXRvcjxJVW5pY29kZVNlcnZpY2U+KCdVbmljb2RlU2VydmljZScpO1xuZXhwb3J0IGludGVyZmFjZSBJVW5pY29kZVNlcnZpY2Uge1xuICBzZXJ2aWNlQnJhbmQ6IHVuZGVmaW5lZDtcbiAgLyoqIFJlZ2lzdGVyIGFuIFVuaWNvZGUgdmVyc2lvbiBwcm92aWRlci4gKi9cbiAgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZDtcbiAgLyoqIFJlZ2lzdGVyZWQgVW5pY29kZSB2ZXJzaW9ucy4gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM6IHN0cmluZ1tdO1xuICAvKiogQ3VycmVudGx5IGFjdGl2ZSB2ZXJzaW9uLiAqL1xuICBhY3RpdmVWZXJzaW9uOiBzdHJpbmc7XG4gIC8qKiBFdmVudCB0cmlnZ2VyZWQsIHdoZW4gYWN0aXZhdGUgdmVyc2lvbiBjaGFuZ2VkLiAqL1xuICByZWFkb25seSBvbkNoYW5nZTogSUV2ZW50PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFVuaWNvZGUgdmVyc2lvbiBkZXBlbmRlbnRcbiAgICovXG4gIHdjd2lkdGgoY29kZXBvaW50OiBudW1iZXIpOiBVbmljb2RlQ2hhcldpZHRoO1xuICBnZXRTdHJpbmdDZWxsV2lkdGgoczogc3RyaW5nKTogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJuIGNoYXJhY3RlciB3aWR0aCBhbmQgdHlwZSBmb3IgZ3JhcGhlbWUgY2x1c3RlcmluZy5cbiAgICogSWYgcHJlY2VkaW5nICE9IDAsIGl0IGlzIHRoZSByZXR1cm4gY29kZSBmcm9tIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXI7XG4gICAqIGluIHRoYXQgY2FzZSB0aGUgcmVzdWx0IHNwZWNpZmllcyBpZiB0aGUgY2hhcmFjdGVycyBzaG91bGQgYmUgam9pbmVkLlxuICAgKi9cbiAgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElVbmljb2RlVmVyc2lvblByb3ZpZGVyIHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICB3Y3dpZHRoKHVjczogbnVtYmVyKTogVW5pY29kZUNoYXJXaWR0aDtcbiAgY2hhclByb3BlcnRpZXMoY29kZXBvaW50OiBudW1iZXIsIHByZWNlZGluZzogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzO1xufVxuXG5leHBvcnQgY29uc3QgSURlY29yYXRpb25TZXJ2aWNlID0gY3JlYXRlRGVjb3JhdG9yPElEZWNvcmF0aW9uU2VydmljZT4oJ0RlY29yYXRpb25TZXJ2aWNlJyk7XG5leHBvcnQgaW50ZXJmYWNlIElEZWNvcmF0aW9uU2VydmljZSBleHRlbmRzIElEaXNwb3NhYmxlIHtcbiAgc2VydmljZUJyYW5kOiB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGRlY29yYXRpb25zOiBJdGVyYWJsZUl0ZXJhdG9yPElJbnRlcm5hbERlY29yYXRpb24+O1xuICByZWFkb25seSBvbkRlY29yYXRpb25SZWdpc3RlcmVkOiBJRXZlbnQ8SUludGVybmFsRGVjb3JhdGlvbj47XG4gIHJlYWRvbmx5IG9uRGVjb3JhdGlvblJlbW92ZWQ6IElFdmVudDxJSW50ZXJuYWxEZWNvcmF0aW9uPjtcbiAgcmVnaXN0ZXJEZWNvcmF0aW9uKGRlY29yYXRpb25PcHRpb25zOiBJRGVjb3JhdGlvbk9wdGlvbnMpOiBJRGVjb3JhdGlvbiB8IHVuZGVmaW5lZDtcbiAgcmVzZXQoKTogdm9pZDtcbiAgLyoqXG4gICAqIFRyaWdnZXIgYSBjYWxsYmFjayBvdmVyIHRoZSBkZWNvcmF0aW9uIGF0IGEgY2VsbCAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuIFRoaXMgdXNlcyBhIGNhbGxiYWNrXG4gICAqIGluc3RlYWQgb2YgYW4gaXRlcmF0b3IgYXMgaXQncyB0eXBpY2FsbHkgdXNlZCBpbiBob3QgY29kZSBwYXRocy5cbiAgICovXG4gIGZvckVhY2hEZWNvcmF0aW9uQXRDZWxsKHg6IG51bWJlciwgbGluZTogbnVtYmVyLCBsYXllcjogJ2JvdHRvbScgfCAndG9wJyB8IHVuZGVmaW5lZCwgY2FsbGJhY2s6IChkZWNvcmF0aW9uOiBJSW50ZXJuYWxEZWNvcmF0aW9uKSA9PiB2b2lkKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUludGVybmFsRGVjb3JhdGlvbiBleHRlbmRzIElEZWNvcmF0aW9uIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogSURlY29yYXRpb25PcHRpb25zO1xuICByZWFkb25seSBiYWNrZ3JvdW5kQ29sb3JSR0I6IElDb2xvciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgZm9yZWdyb3VuZENvbG9yUkdCOiBJQ29sb3IgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uUmVuZGVyRW1pdHRlcjogSUV2ZW50RW1pdHRlcjxIVE1MRWxlbWVudD47XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOSBUaGUgeHRlcm0uanMgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2NvbW1vbi9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgVW5pY29kZVY2IH0gZnJvbSAnY29tbW9uL2lucHV0L1VuaWNvZGVWNic7XG5pbXBvcnQgeyBJVW5pY29kZVNlcnZpY2UsIElVbmljb2RlVmVyc2lvblByb3ZpZGVyLCBVbmljb2RlQ2hhclByb3BlcnRpZXMsIFVuaWNvZGVDaGFyV2lkdGggfSBmcm9tICdjb21tb24vc2VydmljZXMvU2VydmljZXMnO1xuXG5leHBvcnQgY2xhc3MgVW5pY29kZVNlcnZpY2UgaW1wbGVtZW50cyBJVW5pY29kZVNlcnZpY2Uge1xuICBwdWJsaWMgc2VydmljZUJyYW5kOiBhbnk7XG5cbiAgcHJpdmF0ZSBfcHJvdmlkZXJzOiB7W2tleTogc3RyaW5nXTogSVVuaWNvZGVWZXJzaW9uUHJvdmlkZXJ9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcHJpdmF0ZSBfYWN0aXZlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfYWN0aXZlUHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIHB1YmxpYyByZWFkb25seSBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmV2ZW50O1xuXG4gIHB1YmxpYyBzdGF0aWMgZXh0cmFjdFNob3VsZEpvaW4odmFsdWU6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodmFsdWUgJiAxKSAhPT0gMDtcbiAgfVxuICBwdWJsaWMgc3RhdGljIGV4dHJhY3RXaWR0aCh2YWx1ZTogVW5pY29kZUNoYXJQcm9wZXJ0aWVzKTogVW5pY29kZUNoYXJXaWR0aCB7XG4gICAgcmV0dXJuICgodmFsdWUgPj4gMSkgJiAweDMpIGFzIFVuaWNvZGVDaGFyV2lkdGg7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBleHRyYWN0Q2hhcktpbmQodmFsdWU6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHZhbHVlID4+IDM7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eVZhbHVlKHN0YXRlOiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIHNob3VsZEpvaW46IGJvb2xlYW4gPSBmYWxzZSk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgcmV0dXJuICgoc3RhdGUgJiAweGZmZmZmZikgPDwgMykgfCAoKHdpZHRoICYgMykgPDwgMSkgfCAoc2hvdWxkSm9pbj8xOjApO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gbmV3IFVuaWNvZGVWNigpO1xuICAgIHRoaXMucmVnaXN0ZXIoZGVmYXVsdFByb3ZpZGVyKTtcbiAgICB0aGlzLl9hY3RpdmUgPSBkZWZhdWx0UHJvdmlkZXIudmVyc2lvbjtcbiAgICB0aGlzLl9hY3RpdmVQcm92aWRlciA9IGRlZmF1bHRQcm92aWRlcjtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmVyc2lvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9wcm92aWRlcnMpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVWZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX3Byb3ZpZGVyc1t2ZXJzaW9uXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIFVuaWNvZGUgdmVyc2lvbiBcIiR7dmVyc2lvbn1cImApO1xuICAgIH1cbiAgICB0aGlzLl9hY3RpdmUgPSB2ZXJzaW9uO1xuICAgIHRoaXMuX2FjdGl2ZVByb3ZpZGVyID0gdGhpcy5fcHJvdmlkZXJzW3ZlcnNpb25dO1xuICAgIHRoaXMuX29uQ2hhbmdlLmZpcmUodmVyc2lvbik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXIocHJvdmlkZXI6IElVbmljb2RlVmVyc2lvblByb3ZpZGVyKTogdm9pZCB7XG4gICAgdGhpcy5fcHJvdmlkZXJzW3Byb3ZpZGVyLnZlcnNpb25dID0gcHJvdmlkZXI7XG4gIH1cblxuICAvKipcbiAgICogVW5pY29kZSB2ZXJzaW9uIGRlcGVuZGVudCBpbnRlcmZhY2UuXG4gICAqL1xuICBwdWJsaWMgd2N3aWR0aChudW06IG51bWJlcik6IFVuaWNvZGVDaGFyV2lkdGgge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVQcm92aWRlci53Y3dpZHRoKG51bSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RyaW5nQ2VsbFdpZHRoKHM6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgbGV0IHByZWNlZGluZ0luZm8gPSAwO1xuICAgIGNvbnN0IGxlbmd0aCA9IHMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgIGxldCBjb2RlID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgICAgLy8gc3Vycm9nYXRlIHBhaXIgZmlyc3RcbiAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICBpZiAoKytpID49IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2l0aCBzdHJpbmdzIHJldHJpZXZlZCBmcm9tXG4gICAgICAgICAgLy8gQnVmZmVyLnRyYW5zbGF0ZVRvU3RyaW5nIGFzIGl0IGNvbnZlcnRzIGZyb20gVVRGLTMyXG4gICAgICAgICAgLy8gYW5kIHRoZXJlZm9yZSBhbHdheXMgc2hvdWxkIGNvbnRhaW4gdGhlIHNlY29uZCBwYXJ0XG4gICAgICAgICAgLy8gZm9yIGFueSBvdGhlciBzdHJpbmcgd2Ugc3RpbGwgaGF2ZSB0byBoYW5kbGUgaXQgc29tZWhvdzpcbiAgICAgICAgICAvLyBzaW1wbHkgdHJlYXQgdGhlIGxvbmVseSBzdXJyb2dhdGUgZmlyc3QgYXMgYSBzaW5nbGUgY2hhciAoVUNTLTIgYmVoYXZpb3IpXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdCArIHRoaXMud2N3aWR0aChjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWNvbmQgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIGNvbnZlcnQgc3Vycm9nYXRlIHBhaXIgdG8gaGlnaCBjb2RlcG9pbnQgb25seSBmb3IgdmFsaWQgc2Vjb25kIHBhcnQgKFVURi0xNilcbiAgICAgICAgLy8gb3RoZXJ3aXNlIHRyZWF0IHRoZW0gaW5kZXBlbmRlbnRseSAoVUNTLTIgYmVoYXZpb3IpXG4gICAgICAgIGlmICgweERDMDAgPD0gc2Vjb25kICYmIHNlY29uZCA8PSAweERGRkYpIHtcbiAgICAgICAgICBjb2RlID0gKGNvZGUgLSAweEQ4MDApICogMHg0MDAgKyBzZWNvbmQgLSAweERDMDAgKyAweDEwMDAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCArPSB0aGlzLndjd2lkdGgoc2Vjb25kKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudEluZm8gPSB0aGlzLmNoYXJQcm9wZXJ0aWVzKGNvZGUsIHByZWNlZGluZ0luZm8pO1xuICAgICAgbGV0IGNoV2lkdGggPSBVbmljb2RlU2VydmljZS5leHRyYWN0V2lkdGgoY3VycmVudEluZm8pO1xuICAgICAgaWYgKFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RTaG91bGRKb2luKGN1cnJlbnRJbmZvKSkge1xuICAgICAgICBjaFdpZHRoIC09IFVuaWNvZGVTZXJ2aWNlLmV4dHJhY3RXaWR0aChwcmVjZWRpbmdJbmZvKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaFdpZHRoO1xuICAgICAgcHJlY2VkaW5nSW5mbyA9IGN1cnJlbnRJbmZvO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludDogbnVtYmVyLCBwcmVjZWRpbmc6IFVuaWNvZGVDaGFyUHJvcGVydGllcyk6IFVuaWNvZGVDaGFyUHJvcGVydGllcyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVByb3ZpZGVyLmNoYXJQcm9wZXJ0aWVzKGNvZGVwb2ludCwgcHJlY2VkaW5nKTtcbiAgfVxufVxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0ICogYXMgU3RyaW5ncyBmcm9tICdicm93c2VyL0xvY2FsaXphYmxlU3RyaW5ncyc7XG5pbXBvcnQgeyBUZXJtaW5hbCBhcyBUZXJtaW5hbENvcmUgfSBmcm9tICdicm93c2VyL1Rlcm1pbmFsJztcbmltcG9ydCB7IElCdWZmZXJSYW5nZSwgSVRlcm1pbmFsIH0gZnJvbSAnYnJvd3Nlci9UeXBlcyc7XG5pbXBvcnQgeyBJRXZlbnQgfSBmcm9tICdjb21tb24vRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICdjb21tb24vTGlmZWN5Y2xlJztcbmltcG9ydCB7IElUZXJtaW5hbE9wdGlvbnMgfSBmcm9tICdjb21tb24vVHlwZXMnO1xuaW1wb3J0IHsgQWRkb25NYW5hZ2VyIH0gZnJvbSAnY29tbW9uL3B1YmxpYy9BZGRvbk1hbmFnZXInO1xuaW1wb3J0IHsgQnVmZmVyTmFtZXNwYWNlQXBpIH0gZnJvbSAnY29tbW9uL3B1YmxpYy9CdWZmZXJOYW1lc3BhY2VBcGknO1xuaW1wb3J0IHsgUGFyc2VyQXBpIH0gZnJvbSAnY29tbW9uL3B1YmxpYy9QYXJzZXJBcGknO1xuaW1wb3J0IHsgVW5pY29kZUFwaSB9IGZyb20gJ2NvbW1vbi9wdWJsaWMvVW5pY29kZUFwaSc7XG5pbXBvcnQgeyBJQnVmZmVyTmFtZXNwYWNlIGFzIElCdWZmZXJOYW1lc3BhY2VBcGksIElEZWNvcmF0aW9uLCBJRGVjb3JhdGlvbk9wdGlvbnMsIElEaXNwb3NhYmxlLCBJTGlua1Byb3ZpZGVyLCBJTG9jYWxpemFibGVTdHJpbmdzLCBJTWFya2VyLCBJTW9kZXMsIElQYXJzZXIsIElUZXJtaW5hbEFkZG9uLCBUZXJtaW5hbCBhcyBJVGVybWluYWxBcGksIElUZXJtaW5hbEluaXRPbmx5T3B0aW9ucywgSVVuaWNvZGVIYW5kbGluZyB9IGZyb20gJ0B4dGVybS94dGVybSc7XG5cbi8qKlxuICogVGhlIHNldCBvZiBvcHRpb25zIHRoYXQgb25seSBoYXZlIGFuIGVmZmVjdCB3aGVuIHNldCBpbiB0aGUgVGVybWluYWwgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IENPTlNUUlVDVE9SX09OTFlfT1BUSU9OUyA9IFsnY29scycsICdyb3dzJ107XG5cbmV4cG9ydCBjbGFzcyBUZXJtaW5hbCBleHRlbmRzIERpc3Bvc2FibGUgaW1wbGVtZW50cyBJVGVybWluYWxBcGkge1xuICBwcml2YXRlIF9jb3JlOiBJVGVybWluYWw7XG4gIHByaXZhdGUgX2FkZG9uTWFuYWdlcjogQWRkb25NYW5hZ2VyO1xuICBwcml2YXRlIF9wYXJzZXI6IElQYXJzZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2J1ZmZlcjogQnVmZmVyTmFtZXNwYWNlQXBpIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9wdWJsaWNPcHRpb25zOiBSZXF1aXJlZDxJVGVybWluYWxPcHRpb25zPjtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogSVRlcm1pbmFsT3B0aW9ucyAmIElUZXJtaW5hbEluaXRPbmx5T3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9jb3JlID0gdGhpcy5yZWdpc3RlcihuZXcgVGVybWluYWxDb3JlKG9wdGlvbnMpKTtcbiAgICB0aGlzLl9hZGRvbk1hbmFnZXIgPSB0aGlzLnJlZ2lzdGVyKG5ldyBBZGRvbk1hbmFnZXIoKSk7XG5cbiAgICB0aGlzLl9wdWJsaWNPcHRpb25zID0geyAuLi4gdGhpcy5fY29yZS5vcHRpb25zIH07XG4gICAgY29uc3QgZ2V0dGVyID0gKHByb3BOYW1lOiBzdHJpbmcpOiBhbnkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvcmUub3B0aW9uc1twcm9wTmFtZV07XG4gICAgfTtcbiAgICBjb25zdCBzZXR0ZXIgPSAocHJvcE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5fY2hlY2tSZWFkb25seU9wdGlvbnMocHJvcE5hbWUpO1xuICAgICAgdGhpcy5fY29yZS5vcHRpb25zW3Byb3BOYW1lXSA9IHZhbHVlO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHByb3BOYW1lIGluIHRoaXMuX2NvcmUub3B0aW9ucykge1xuICAgICAgY29uc3QgZGVzYyA9IHtcbiAgICAgICAgZ2V0OiBnZXR0ZXIuYmluZCh0aGlzLCBwcm9wTmFtZSksXG4gICAgICAgIHNldDogc2V0dGVyLmJpbmQodGhpcywgcHJvcE5hbWUpXG4gICAgICB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMuX3B1YmxpY09wdGlvbnMsIHByb3BOYW1lLCBkZXNjKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja1JlYWRvbmx5T3B0aW9ucyhwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgYW55IGNvbnN0cnVjdG9yIG9ubHkgb3B0aW9uIGlzIG1vZGlmaWVkXG4gICAgLy8gZnJvbSB0ZXJtaW5hbC5vcHRpb25zXG4gICAgLy8gTW9kaWZpY2F0aW9ucyBmcm9tIGFueXdoZXJlIGVsc2UgYXJlIGFsbG93ZWRcbiAgICBpZiAoQ09OU1RSVUNUT1JfT05MWV9PUFRJT05TLmluY2x1ZGVzKHByb3BOYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gXCIke3Byb3BOYW1lfVwiIGNhbiBvbmx5IGJlIHNldCBpbiB0aGUgY29uc3RydWN0b3JgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jaGVja1Byb3Bvc2VkQXBpKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY29yZS5vcHRpb25zU2VydmljZS5yYXdPcHRpb25zLmFsbG93UHJvcG9zZWRBcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc2V0IHRoZSBhbGxvd1Byb3Bvc2VkQXBpIG9wdGlvbiB0byB0cnVlIHRvIHVzZSBwcm9wb3NlZCBBUEknKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IG9uQmVsbCgpOiBJRXZlbnQ8dm9pZD4geyByZXR1cm4gdGhpcy5fY29yZS5vbkJlbGw7IH1cbiAgcHVibGljIGdldCBvbkJpbmFyeSgpOiBJRXZlbnQ8c3RyaW5nPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uQmluYXJ5OyB9XG4gIHB1YmxpYyBnZXQgb25DdXJzb3JNb3ZlKCk6IElFdmVudDx2b2lkPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uQ3Vyc29yTW92ZTsgfVxuICBwdWJsaWMgZ2V0IG9uRGF0YSgpOiBJRXZlbnQ8c3RyaW5nPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uRGF0YTsgfVxuICBwdWJsaWMgZ2V0IG9uS2V5KCk6IElFdmVudDx7IGtleTogc3RyaW5nLCBkb21FdmVudDogS2V5Ym9hcmRFdmVudCB9PiB7IHJldHVybiB0aGlzLl9jb3JlLm9uS2V5OyB9XG4gIHB1YmxpYyBnZXQgb25MaW5lRmVlZCgpOiBJRXZlbnQ8dm9pZD4geyByZXR1cm4gdGhpcy5fY29yZS5vbkxpbmVGZWVkOyB9XG4gIHB1YmxpYyBnZXQgb25SZW5kZXIoKTogSUV2ZW50PHsgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIgfT4geyByZXR1cm4gdGhpcy5fY29yZS5vblJlbmRlcjsgfVxuICBwdWJsaWMgZ2V0IG9uUmVzaXplKCk6IElFdmVudDx7IGNvbHM6IG51bWJlciwgcm93czogbnVtYmVyIH0+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25SZXNpemU7IH1cbiAgcHVibGljIGdldCBvblNjcm9sbCgpOiBJRXZlbnQ8bnVtYmVyPiB7IHJldHVybiB0aGlzLl9jb3JlLm9uU2Nyb2xsOyB9XG4gIHB1YmxpYyBnZXQgb25TZWxlY3Rpb25DaGFuZ2UoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25TZWxlY3Rpb25DaGFuZ2U7IH1cbiAgcHVibGljIGdldCBvblRpdGxlQ2hhbmdlKCk6IElFdmVudDxzdHJpbmc+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25UaXRsZUNoYW5nZTsgfVxuICBwdWJsaWMgZ2V0IG9uV3JpdGVQYXJzZWQoKTogSUV2ZW50PHZvaWQ+IHsgcmV0dXJuIHRoaXMuX2NvcmUub25Xcml0ZVBhcnNlZDsgfVxuXG4gIHB1YmxpYyBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jb3JlLmVsZW1lbnQ7IH1cbiAgcHVibGljIGdldCBwYXJzZXIoKTogSVBhcnNlciB7XG4gICAgaWYgKCF0aGlzLl9wYXJzZXIpIHtcbiAgICAgIHRoaXMuX3BhcnNlciA9IG5ldyBQYXJzZXJBcGkodGhpcy5fY29yZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXJzZXI7XG4gIH1cbiAgcHVibGljIGdldCB1bmljb2RlKCk6IElVbmljb2RlSGFuZGxpbmcge1xuICAgIHRoaXMuX2NoZWNrUHJvcG9zZWRBcGkoKTtcbiAgICByZXR1cm4gbmV3IFVuaWNvZGVBcGkodGhpcy5fY29yZSk7XG4gIH1cbiAgcHVibGljIGdldCB0ZXh0YXJlYSgpOiBIVE1MVGV4dEFyZWFFbGVtZW50IHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvcmUudGV4dGFyZWE7IH1cbiAgcHVibGljIGdldCByb3dzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9jb3JlLnJvd3M7IH1cbiAgcHVibGljIGdldCBjb2xzKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9jb3JlLmNvbHM7IH1cbiAgcHVibGljIGdldCBidWZmZXIoKTogSUJ1ZmZlck5hbWVzcGFjZUFwaSB7XG4gICAgaWYgKCF0aGlzLl9idWZmZXIpIHtcbiAgICAgIHRoaXMuX2J1ZmZlciA9IHRoaXMucmVnaXN0ZXIobmV3IEJ1ZmZlck5hbWVzcGFjZUFwaSh0aGlzLl9jb3JlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9idWZmZXI7XG4gIH1cbiAgcHVibGljIGdldCBtYXJrZXJzKCk6IFJlYWRvbmx5QXJyYXk8SU1hcmtlcj4ge1xuICAgIHRoaXMuX2NoZWNrUHJvcG9zZWRBcGkoKTtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5tYXJrZXJzO1xuICB9XG4gIHB1YmxpYyBnZXQgbW9kZXMoKTogSU1vZGVzIHtcbiAgICBjb25zdCBtID0gdGhpcy5fY29yZS5jb3JlU2VydmljZS5kZWNQcml2YXRlTW9kZXM7XG4gICAgbGV0IG1vdXNlVHJhY2tpbmdNb2RlOiAnbm9uZScgfCAneDEwJyB8ICd2dDIwMCcgfCAnZHJhZycgfCAnYW55JyA9ICdub25lJztcbiAgICBzd2l0Y2ggKHRoaXMuX2NvcmUuY29yZU1vdXNlU2VydmljZS5hY3RpdmVQcm90b2NvbCkge1xuICAgICAgY2FzZSAnWDEwJzogbW91c2VUcmFja2luZ01vZGUgPSAneDEwJzsgYnJlYWs7XG4gICAgICBjYXNlICdWVDIwMCc6IG1vdXNlVHJhY2tpbmdNb2RlID0gJ3Z0MjAwJzsgYnJlYWs7XG4gICAgICBjYXNlICdEUkFHJzogbW91c2VUcmFja2luZ01vZGUgPSAnZHJhZyc7IGJyZWFrO1xuICAgICAgY2FzZSAnQU5ZJzogbW91c2VUcmFja2luZ01vZGUgPSAnYW55JzsgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBhcHBsaWNhdGlvbkN1cnNvcktleXNNb2RlOiBtLmFwcGxpY2F0aW9uQ3Vyc29yS2V5cyxcbiAgICAgIGFwcGxpY2F0aW9uS2V5cGFkTW9kZTogbS5hcHBsaWNhdGlvbktleXBhZCxcbiAgICAgIGJyYWNrZXRlZFBhc3RlTW9kZTogbS5icmFja2V0ZWRQYXN0ZU1vZGUsXG4gICAgICBpbnNlcnRNb2RlOiB0aGlzLl9jb3JlLmNvcmVTZXJ2aWNlLm1vZGVzLmluc2VydE1vZGUsXG4gICAgICBtb3VzZVRyYWNraW5nTW9kZTogbW91c2VUcmFja2luZ01vZGUsXG4gICAgICBvcmlnaW5Nb2RlOiBtLm9yaWdpbixcbiAgICAgIHJldmVyc2VXcmFwYXJvdW5kTW9kZTogbS5yZXZlcnNlV3JhcGFyb3VuZCxcbiAgICAgIHNlbmRGb2N1c01vZGU6IG0uc2VuZEZvY3VzLFxuICAgICAgd3JhcGFyb3VuZE1vZGU6IG0ud3JhcGFyb3VuZFxuICAgIH07XG4gIH1cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IFJlcXVpcmVkPElUZXJtaW5hbE9wdGlvbnM+IHtcbiAgICByZXR1cm4gdGhpcy5fcHVibGljT3B0aW9ucztcbiAgfVxuICBwdWJsaWMgc2V0IG9wdGlvbnMob3B0aW9uczogSVRlcm1pbmFsT3B0aW9ucykge1xuICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gb3B0aW9ucykge1xuICAgICAgdGhpcy5fcHVibGljT3B0aW9uc1twcm9wTmFtZV0gPSBvcHRpb25zW3Byb3BOYW1lXTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGJsdXIoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5ibHVyKCk7XG4gIH1cbiAgcHVibGljIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuZm9jdXMoKTtcbiAgfVxuICBwdWJsaWMgaW5wdXQoZGF0YTogc3RyaW5nLCB3YXNVc2VySW5wdXQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5pbnB1dChkYXRhLCB3YXNVc2VySW5wdXQpO1xuICB9XG4gIHB1YmxpYyByZXNpemUoY29sdW1uczogbnVtYmVyLCByb3dzOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2Vycyhjb2x1bW5zLCByb3dzKTtcbiAgICB0aGlzLl9jb3JlLnJlc2l6ZShjb2x1bW5zLCByb3dzKTtcbiAgfVxuICBwdWJsaWMgb3BlbihwYXJlbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5vcGVuKHBhcmVudCk7XG4gIH1cbiAgcHVibGljIGF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlcihjdXN0b21LZXlFdmVudEhhbmRsZXI6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuYXR0YWNoQ3VzdG9tS2V5RXZlbnRIYW5kbGVyKGN1c3RvbUtleUV2ZW50SGFuZGxlcik7XG4gIH1cbiAgcHVibGljIGF0dGFjaEN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyOiAoZXZlbnQ6IFdoZWVsRXZlbnQpID0+IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9jb3JlLmF0dGFjaEN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKGN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyKTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJMaW5rUHJvdmlkZXIobGlua1Byb3ZpZGVyOiBJTGlua1Byb3ZpZGVyKTogSURpc3Bvc2FibGUge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyTGlua1Byb3ZpZGVyKGxpbmtQcm92aWRlcik7XG4gIH1cbiAgcHVibGljIHJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGhhbmRsZXI6ICh0ZXh0OiBzdHJpbmcpID0+IFtudW1iZXIsIG51bWJlcl1bXSk6IG51bWJlciB7XG4gICAgdGhpcy5fY2hlY2tQcm9wb3NlZEFwaSgpO1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGhhbmRsZXIpO1xuICB9XG4gIHB1YmxpYyBkZXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGpvaW5lcklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCk7XG4gICAgdGhpcy5fY29yZS5kZXJlZ2lzdGVyQ2hhcmFjdGVySm9pbmVyKGpvaW5lcklkKTtcbiAgfVxuICBwdWJsaWMgcmVnaXN0ZXJNYXJrZXIoY3Vyc29yWU9mZnNldDogbnVtYmVyID0gMCk6IElNYXJrZXIge1xuICAgIHRoaXMuX3ZlcmlmeUludGVnZXJzKGN1cnNvcllPZmZzZXQpO1xuICAgIHJldHVybiB0aGlzLl9jb3JlLnJlZ2lzdGVyTWFya2VyKGN1cnNvcllPZmZzZXQpO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnM6IElEZWNvcmF0aW9uT3B0aW9ucyk6IElEZWNvcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLl9jaGVja1Byb3Bvc2VkQXBpKCk7XG4gICAgdGhpcy5fdmVyaWZ5UG9zaXRpdmVJbnRlZ2VycyhkZWNvcmF0aW9uT3B0aW9ucy54ID8/IDAsIGRlY29yYXRpb25PcHRpb25zLndpZHRoID8/IDAsIGRlY29yYXRpb25PcHRpb25zLmhlaWdodCA/PyAwKTtcbiAgICByZXR1cm4gdGhpcy5fY29yZS5yZWdpc3RlckRlY29yYXRpb24oZGVjb3JhdGlvbk9wdGlvbnMpO1xuICB9XG4gIHB1YmxpYyBoYXNTZWxlY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmUuaGFzU2VsZWN0aW9uKCk7XG4gIH1cbiAgcHVibGljIHNlbGVjdChjb2x1bW46IG51bWJlciwgcm93OiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMoY29sdW1uLCByb3csIGxlbmd0aCk7XG4gICAgdGhpcy5fY29yZS5zZWxlY3QoY29sdW1uLCByb3csIGxlbmd0aCk7XG4gIH1cbiAgcHVibGljIGdldFNlbGVjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLmdldFNlbGVjdGlvbigpO1xuICB9XG4gIHB1YmxpYyBnZXRTZWxlY3Rpb25Qb3NpdGlvbigpOiBJQnVmZmVyUmFuZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb3JlLmdldFNlbGVjdGlvblBvc2l0aW9uKCk7XG4gIH1cbiAgcHVibGljIGNsZWFyU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuY2xlYXJTZWxlY3Rpb24oKTtcbiAgfVxuICBwdWJsaWMgc2VsZWN0QWxsKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuc2VsZWN0QWxsKCk7XG4gIH1cbiAgcHVibGljIHNlbGVjdExpbmVzKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMoc3RhcnQsIGVuZCk7XG4gICAgdGhpcy5fY29yZS5zZWxlY3RMaW5lcyhzdGFydCwgZW5kKTtcbiAgfVxuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cbiAgcHVibGljIHNjcm9sbExpbmVzKGFtb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMoYW1vdW50KTtcbiAgICB0aGlzLl9jb3JlLnNjcm9sbExpbmVzKGFtb3VudCk7XG4gIH1cbiAgcHVibGljIHNjcm9sbFBhZ2VzKHBhZ2VDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMocGFnZUNvdW50KTtcbiAgICB0aGlzLl9jb3JlLnNjcm9sbFBhZ2VzKHBhZ2VDb3VudCk7XG4gIH1cbiAgcHVibGljIHNjcm9sbFRvVG9wKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuc2Nyb2xsVG9Ub3AoKTtcbiAgfVxuICBwdWJsaWMgc2Nyb2xsVG9Cb3R0b20oKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5zY3JvbGxUb0JvdHRvbSgpO1xuICB9XG4gIHB1YmxpYyBzY3JvbGxUb0xpbmUobGluZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdmVyaWZ5SW50ZWdlcnMobGluZSk7XG4gICAgdGhpcy5fY29yZS5zY3JvbGxUb0xpbmUobGluZSk7XG4gIH1cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUuY2xlYXIoKTtcbiAgfVxuICBwdWJsaWMgd3JpdGUoZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS53cml0ZShkYXRhLCBjYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIHdyaXRlbG4oZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSwgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS53cml0ZShkYXRhKTtcbiAgICB0aGlzLl9jb3JlLndyaXRlKCdcXHJcXG4nLCBjYWxsYmFjayk7XG4gIH1cbiAgcHVibGljIHBhc3RlKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUucGFzdGUoZGF0YSk7XG4gIH1cbiAgcHVibGljIHJlZnJlc2goc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl92ZXJpZnlJbnRlZ2VycyhzdGFydCwgZW5kKTtcbiAgICB0aGlzLl9jb3JlLnJlZnJlc2goc3RhcnQsIGVuZCk7XG4gIH1cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2NvcmUucmVzZXQoKTtcbiAgfVxuICBwdWJsaWMgY2xlYXJUZXh0dXJlQXRsYXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29yZS5jbGVhclRleHR1cmVBdGxhcygpO1xuICB9XG4gIHB1YmxpYyBsb2FkQWRkb24oYWRkb246IElUZXJtaW5hbEFkZG9uKTogdm9pZCB7XG4gICAgdGhpcy5fYWRkb25NYW5hZ2VyLmxvYWRBZGRvbih0aGlzLCBhZGRvbik7XG4gIH1cbiAgcHVibGljIHN0YXRpYyBnZXQgc3RyaW5ncygpOiBJTG9jYWxpemFibGVTdHJpbmdzIHtcbiAgICByZXR1cm4gU3RyaW5ncztcbiAgfVxuXG4gIHByaXZhdGUgX3ZlcmlmeUludGVnZXJzKC4uLnZhbHVlczogbnVtYmVyW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgaWYgKHZhbHVlID09PSBJbmZpbml0eSB8fCBpc05hTih2YWx1ZSkgfHwgdmFsdWUgJSAxICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBBUEkgb25seSBhY2NlcHRzIGludGVnZXJzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdmVyaWZ5UG9zaXRpdmVJbnRlZ2VycyguLi52YWx1ZXM6IG51bWJlcltdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmICh2YWx1ZSAmJiAodmFsdWUgPT09IEluZmluaXR5IHx8IGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSAlIDEgIT09IDAgfHwgdmFsdWUgPCAwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgQVBJIG9ubHkgYWNjZXB0cyBwb3NpdGl2ZSBpbnRlZ2VycycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsImEiLCJpIiwiZ2xvYmFsVGhpcyIsIkFjY2Vzc2liaWxpdHlNYW5hZ2VyIiwiRGlzcG9zYWJsZSIsImNvbnN0cnVjdG9yIiwiX3Rlcm1pbmFsIiwiaW5zdGFudGlhdGlvblNlcnZpY2UiLCJzdXBlciIsIl9jb3JlQnJvd3NlclNlcnZpY2UiLCJfcmVuZGVyU2VydmljZSIsIl9yb3dDb2x1bW5zIiwiV2Vha01hcCIsIl9saXZlUmVnaW9uTGluZUNvdW50IiwiX2NoYXJzVG9Db25zdW1lIiwiX2NoYXJzVG9Bbm5vdW5jZSIsInRoaXMiLCJfYWNjZXNzaWJpbGl0eUNvbnRhaW5lciIsIm1haW5Eb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJfcm93Q29udGFpbmVyIiwic2V0QXR0cmlidXRlIiwiX3Jvd0VsZW1lbnRzIiwicm93cyIsIl9jcmVhdGVBY2Nlc3NpYmlsaXR5VHJlZU5vZGUiLCJhcHBlbmRDaGlsZCIsIl90b3BCb3VuZGFyeUZvY3VzTGlzdGVuZXIiLCJlIiwiX2hhbmRsZUJvdW5kYXJ5Rm9jdXMiLCJfYm90dG9tQm91bmRhcnlGb2N1c0xpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsImxlbmd0aCIsIl9yZWZyZXNoUm93c0RpbWVuc2lvbnMiLCJfbGl2ZVJlZ2lvbiIsIl9saXZlUmVnaW9uRGVib3VuY2VyIiwicmVnaXN0ZXIiLCJUaW1lQmFzZWREZWJvdW5jZXIiLCJfcmVuZGVyUm93cyIsImJpbmQiLCJlbGVtZW50IiwiRXJyb3IiLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLCJvblJlc2l6ZSIsIl9oYW5kbGVSZXNpemUiLCJvblJlbmRlciIsIl9yZWZyZXNoUm93cyIsInN0YXJ0IiwiZW5kIiwib25TY3JvbGwiLCJvbkExMXlDaGFyIiwiY2hhciIsIl9oYW5kbGVDaGFyIiwib25MaW5lRmVlZCIsIm9uQTExeVRhYiIsInNwYWNlQ291bnQiLCJfaGFuZGxlVGFiIiwib25LZXkiLCJfaGFuZGxlS2V5Iiwia2V5Iiwib25CbHVyIiwiX2NsZWFyTGl2ZVJlZ2lvbiIsIm9uRGltZW5zaW9uc0NoYW5nZSIsImFkZERpc3Bvc2FibGVEb21MaXN0ZW5lciIsImRvY3VtZW50IiwiX2hhbmRsZVNlbGVjdGlvbkNoYW5nZSIsIm9uRHByQ2hhbmdlIiwidG9EaXNwb3NhYmxlIiwicmVtb3ZlIiwiTUFYX1JPV1NfVE9fUkVBRCIsInNoaWZ0IiwidGV4dENvbnRlbnQiLCJTdHJpbmdzIiwidG9vTXVjaE91dHB1dCIsImtleUNoYXIiLCJ0ZXN0IiwicHVzaCIsInJlZnJlc2giLCJidWZmZXIiLCJzZXRTaXplIiwibGluZXMiLCJ0b1N0cmluZyIsImxpbmUiLCJnZXQiLCJ5ZGlzcCIsImNvbHVtbnMiLCJsaW5lRGF0YSIsInRyYW5zbGF0ZVRvU3RyaW5nIiwidW5kZWZpbmVkIiwicG9zSW5TZXQiLCJpbm5lclRleHQiLCJzZXQiLCJfYW5ub3VuY2VDaGFyYWN0ZXJzIiwicG9zaXRpb24iLCJib3VuZGFyeUVsZW1lbnQiLCJ0YXJnZXQiLCJiZWZvcmVCb3VuZGFyeUVsZW1lbnQiLCJnZXRBdHRyaWJ1dGUiLCJyZWxhdGVkVGFyZ2V0IiwidG9wQm91bmRhcnlFbGVtZW50IiwiYm90dG9tQm91bmRhcnlFbGVtZW50IiwicG9wIiwicmVtb3ZlQ2hpbGQiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibmV3RWxlbWVudCIsInVuc2hpZnQiLCJzY3JvbGxMaW5lcyIsImZvY3VzIiwicHJldmVudERlZmF1bHQiLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb24iLCJpc0NvbGxhcHNlZCIsImNvbnRhaW5zIiwiYW5jaG9yTm9kZSIsImNsZWFyU2VsZWN0aW9uIiwiZm9jdXNOb2RlIiwiY29uc29sZSIsImVycm9yIiwiYmVnaW4iLCJub2RlIiwib2Zmc2V0IiwiYW5jaG9yT2Zmc2V0IiwiZm9jdXNPZmZzZXQiLCJjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiIsIk5vZGUiLCJET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkciLCJET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkiLCJET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkciLCJjaGlsZE5vZGVzIiwibGFzdFJvd0VsZW1lbnQiLCJzbGljZSIsInRvUm93Q29sdW1uIiwicm93RWxlbWVudCIsIlRleHQiLCJwYXJlbnROb2RlIiwicm93IiwicGFyc2VJbnQiLCJpc05hTiIsIndhcm4iLCJjb2x1bW4iLCJjb2xzIiwiYmVnaW5Sb3dDb2x1bW4iLCJlbmRSb3dDb2x1bW4iLCJzZWxlY3QiLCJjaGlsZHJlbiIsInRhYkluZGV4IiwiX3JlZnJlc2hSb3dEaW1lbnNpb25zIiwiZGltZW5zaW9ucyIsImNzcyIsImNlbGwiLCJoZWlnaHQiLCJzdHlsZSIsIndpZHRoIiwiY2FudmFzIiwiSUluc3RhbnRpYXRpb25TZXJ2aWNlIiwiSUNvcmVCcm93c2VyU2VydmljZSIsIklSZW5kZXJTZXJ2aWNlIiwicHJlcGFyZVRleHRGb3JUZXJtaW5hbCIsInRleHQiLCJyZXBsYWNlIiwiYnJhY2tldFRleHRGb3JQYXN0ZSIsImJyYWNrZXRlZFBhc3RlTW9kZSIsInBhc3RlIiwidGV4dGFyZWEiLCJjb3JlU2VydmljZSIsIm9wdGlvbnNTZXJ2aWNlIiwiZGVjUHJpdmF0ZU1vZGVzIiwicmF3T3B0aW9ucyIsImlnbm9yZUJyYWNrZXRlZFBhc3RlTW9kZSIsInRyaWdnZXJEYXRhRXZlbnQiLCJ2YWx1ZSIsIm1vdmVUZXh0QXJlYVVuZGVyTW91c2VDdXJzb3IiLCJldiIsInNjcmVlbkVsZW1lbnQiLCJwb3MiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsZWZ0IiwiY2xpZW50WCIsInRvcCIsImNsaWVudFkiLCJ6SW5kZXgiLCJzZWxlY3Rpb25TZXJ2aWNlIiwiY2xpcGJvYXJkRGF0YSIsInNldERhdGEiLCJzZWxlY3Rpb25UZXh0Iiwic3RvcFByb3BhZ2F0aW9uIiwiZ2V0RGF0YSIsInNob3VsZFNlbGVjdFdvcmQiLCJyaWdodENsaWNrU2VsZWN0IiwiX2NvbG9yIiwiVHdvS2V5TWFwIiwiX2NzcyIsInNldENzcyIsImJnIiwiZmciLCJnZXRDc3MiLCJzZXRDb2xvciIsImdldENvbG9yIiwiY2xlYXIiLCJ0eXBlIiwiaGFuZGxlciIsIm9wdGlvbnMiLCJkaXNwb3NlZCIsImRpc3Bvc2UiLCJMaW5raWZpZXIiLCJjdXJyZW50TGluayIsIl9jdXJyZW50TGluayIsIl9lbGVtZW50IiwiX21vdXNlU2VydmljZSIsIl9idWZmZXJTZXJ2aWNlIiwiX2xpbmtQcm92aWRlclNlcnZpY2UiLCJfbGlua0NhY2hlRGlzcG9zYWJsZXMiLCJfaXNNb3VzZU91dCIsIl93YXNSZXNpemVkIiwiX2FjdGl2ZUxpbmUiLCJfb25TaG93TGlua1VuZGVybGluZSIsIkV2ZW50RW1pdHRlciIsIm9uU2hvd0xpbmtVbmRlcmxpbmUiLCJldmVudCIsIl9vbkhpZGVMaW5rVW5kZXJsaW5lIiwib25IaWRlTGlua1VuZGVybGluZSIsImdldERpc3Bvc2VBcnJheURpc3Bvc2FibGUiLCJfbGFzdE1vdXNlRXZlbnQiLCJfYWN0aXZlUHJvdmlkZXJSZXBsaWVzIiwiX2NsZWFyQ3VycmVudExpbmsiLCJfaGFuZGxlTW91c2VNb3ZlIiwiX2hhbmRsZU1vdXNlRG93biIsIl9oYW5kbGVNb3VzZVVwIiwiX3Bvc2l0aW9uRnJvbU1vdXNlRXZlbnQiLCJjb21wb3NlZFBhdGgiLCJfbGFzdEJ1ZmZlckNlbGwiLCJ4IiwieSIsIl9oYW5kbGVIb3ZlciIsIl9hc2tGb3JMaW5rIiwiX2xpbmtBdFBvc2l0aW9uIiwibGluayIsInVzZUxpbmVDYWNoZSIsImZvckVhY2giLCJyZXBseSIsImxpbmtXaXRoU3RhdGUiLCJNYXAiLCJsaW5rUHJvdmlkZWQiLCJsaW5rUHJvdmlkZXIiLCJsaW5rUHJvdmlkZXJzIiwiZW50cmllcyIsImV4aXN0aW5nUmVwbHkiLCJfY2hlY2tMaW5rUHJvdmlkZXJSZXN1bHQiLCJwcm92aWRlTGlua3MiLCJsaW5rcyIsImxpbmtzV2l0aFN0YXRlIiwibWFwIiwic2l6ZSIsIl9yZW1vdmVJbnRlcnNlY3RpbmdMaW5rcyIsInJlcGxpZXMiLCJvY2N1cGllZENlbGxzIiwiU2V0IiwicHJvdmlkZXJSZXBseSIsInN0YXJ0WCIsInJhbmdlIiwiZW5kWCIsImhhcyIsInNwbGljZSIsImluZGV4IiwiaGFzTGlua0JlZm9yZSIsImoiLCJsaW5rQXRQb3NpdGlvbiIsImZpbmQiLCJfaGFuZGxlTmV3TGluayIsIl9tb3VzZURvd25MaW5rIiwiYWN0aXZhdGUiLCJzdGFydFJvdyIsImVuZFJvdyIsIl9saW5rTGVhdmUiLCJkaXNwb3NlQXJyYXkiLCJzdGF0ZSIsImRlY29yYXRpb25zIiwidW5kZXJsaW5lIiwicG9pbnRlckN1cnNvciIsImlzSG92ZXJlZCIsIl9saW5rSG92ZXIiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidiIsInRvZ2dsZSIsIl9maXJlVW5kZXJsaW5lRXZlbnQiLCJvblJlbmRlcmVkVmlld3BvcnRDaGFuZ2UiLCJob3ZlciIsInNob3dFdmVudCIsInNjcm9sbE9mZnNldCIsIl9jcmVhdGVMaW5rVW5kZXJsaW5lRXZlbnQiLCJmaXJlIiwibGVhdmUiLCJsb3dlciIsInVwcGVyIiwiY3VycmVudCIsIm1vdXNlU2VydmljZSIsImNvb3JkcyIsImdldENvb3JkcyIsIngxIiwieTEiLCJ4MiIsInkyIiwiSU1vdXNlU2VydmljZSIsIklCdWZmZXJTZXJ2aWNlIiwiSUxpbmtQcm92aWRlclNlcnZpY2UiLCJwcm9tcHRMYWJlbCIsIk9zY0xpbmtQcm92aWRlciIsIl9vcHRpb25zU2VydmljZSIsIl9vc2NMaW5rU2VydmljZSIsImNhbGxiYWNrIiwicmVzdWx0IiwibGlua0hhbmRsZXIiLCJDZWxsRGF0YSIsImxpbmVMZW5ndGgiLCJnZXRUcmltbWVkTGVuZ3RoIiwiY3VycmVudExpbmtJZCIsImN1cnJlbnRTdGFydCIsImZpbmlzaExpbmsiLCJoYXNDb250ZW50IiwibG9hZENlbGwiLCJoYXNFeHRlbmRlZEF0dHJzIiwiZXh0ZW5kZWQiLCJ1cmxJZCIsImdldExpbmtEYXRhIiwidXJpIiwiaWdub3JlTGluayIsImFsbG93Tm9uSHR0cFByb3RvY29scyIsInBhcnNlZCIsIlVSTCIsImluY2x1ZGVzIiwicHJvdG9jb2wiLCJkZWZhdWx0QWN0aXZhdGUiLCJjb25maXJtIiwibmV3V2luZG93Iiwid2luZG93Iiwib3BlbiIsIm9wZW5lciIsImxvY2F0aW9uIiwiaHJlZiIsIklPcHRpb25zU2VydmljZSIsIklPc2NMaW5rU2VydmljZSIsIl9yZW5kZXJDYWxsYmFjayIsIl9yZWZyZXNoQ2FsbGJhY2tzIiwiX2FuaW1hdGlvbkZyYW1lIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJhZGRSZWZyZXNoQ2FsbGJhY2siLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJfaW5uZXJSZWZyZXNoIiwicm93U3RhcnQiLCJyb3dFbmQiLCJyb3dDb3VudCIsIl9yb3dDb3VudCIsIl9yb3dTdGFydCIsIk1hdGgiLCJtaW4iLCJfcm93RW5kIiwibWF4IiwiX3J1blJlZnJlc2hDYWxsYmFja3MiLCJUZXJtaW5hbCIsIkNvcmVUZXJtaW5hbCIsIm9uRm9jdXMiLCJfb25Gb2N1cyIsIl9vbkJsdXIiLCJfb25BMTF5Q2hhckVtaXR0ZXIiLCJfb25BMTF5VGFiRW1pdHRlciIsIm9uV2lsbE9wZW4iLCJfb25XaWxsT3BlbiIsImJyb3dzZXIiLCJCcm93c2VyIiwiX2tleURvd25IYW5kbGVkIiwiX2tleURvd25TZWVuIiwiX2tleVByZXNzSGFuZGxlZCIsIl91bnByb2Nlc3NlZERlYWRLZXkiLCJfYWNjZXNzaWJpbGl0eU1hbmFnZXIiLCJNdXRhYmxlRGlzcG9zYWJsZSIsIl9vbkN1cnNvck1vdmUiLCJvbkN1cnNvck1vdmUiLCJfb25LZXkiLCJfb25SZW5kZXIiLCJfb25TZWxlY3Rpb25DaGFuZ2UiLCJvblNlbGVjdGlvbkNoYW5nZSIsIl9vblRpdGxlQ2hhbmdlIiwib25UaXRsZUNoYW5nZSIsIl9vbkJlbGwiLCJvbkJlbGwiLCJfc2V0dXAiLCJfZGVjb3JhdGlvblNlcnZpY2UiLCJfaW5zdGFudGlhdGlvblNlcnZpY2UiLCJjcmVhdGVJbnN0YW5jZSIsIkRlY29yYXRpb25TZXJ2aWNlIiwic2V0U2VydmljZSIsIklEZWNvcmF0aW9uU2VydmljZSIsIkxpbmtQcm92aWRlclNlcnZpY2UiLCJyZWdpc3RlckxpbmtQcm92aWRlciIsIl9pbnB1dEhhbmRsZXIiLCJvblJlcXVlc3RCZWxsIiwib25SZXF1ZXN0UmVmcmVzaFJvd3MiLCJvblJlcXVlc3RTZW5kRm9jdXMiLCJfcmVwb3J0Rm9jdXMiLCJvblJlcXVlc3RSZXNldCIsInJlc2V0Iiwib25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQiLCJfcmVwb3J0V2luZG93c09wdGlvbnMiLCJvbkNvbG9yIiwiX2hhbmRsZUNvbG9yRXZlbnQiLCJmb3J3YXJkRXZlbnQiLCJfYWZ0ZXJSZXNpemUiLCJfY3VzdG9tS2V5RXZlbnRIYW5kbGVyIiwiX3RoZW1lU2VydmljZSIsInJlcSIsImFjYyIsImlkZW50IiwiY29sb3JSZ2IiLCJjb2xvciIsInRvQ29sb3JSR0IiLCJjb2xvcnMiLCJhbnNpIiwiQzAiLCJFU0MiLCJ0b1JnYlN0cmluZyIsIkMxX0VTQ0FQRUQiLCJTVCIsIm1vZGlmeUNvbG9ycyIsImNoYW5uZWxzIiwidG9Db2xvciIsIm5hcnJvd2VkQWNjIiwicmVzdG9yZUNvbG9yIiwiYnVmZmVycyIsImFjdGl2ZSIsInByZXZlbnRTY3JvbGwiLCJfaGFuZGxlU2NyZWVuUmVhZGVyTW9kZU9wdGlvbkNoYW5nZSIsIl9oYW5kbGVUZXh0QXJlYUZvY3VzIiwic2VuZEZvY3VzIiwiX3Nob3dDdXJzb3IiLCJibHVyIiwiX2hhbmRsZVRleHRBcmVhQmx1ciIsIl9zeW5jVGV4dEFyZWEiLCJpc0N1cnNvckluVmlld3BvcnQiLCJfY29tcG9zaXRpb25IZWxwZXIiLCJpc0NvbXBvc2luZyIsImN1cnNvclkiLCJ5YmFzZSIsImJ1ZmZlckxpbmUiLCJjdXJzb3JYIiwiY2VsbEhlaWdodCIsImdldFdpZHRoIiwiY2VsbFdpZHRoIiwiY3Vyc29yVG9wIiwiY3Vyc29yTGVmdCIsImxpbmVIZWlnaHQiLCJfaW5pdEdsb2JhbCIsIl9iaW5kS2V5cyIsImhhc1NlbGVjdGlvbiIsImNvcHlIYW5kbGVyIiwiX3NlbGVjdGlvblNlcnZpY2UiLCJwYXN0ZUhhbmRsZXJXcmFwcGVyIiwiaGFuZGxlUGFzdGVFdmVudCIsImlzRmlyZWZveCIsImJ1dHRvbiIsInJpZ2h0Q2xpY2tIYW5kbGVyIiwicmlnaHRDbGlja1NlbGVjdHNXb3JkIiwiaXNMaW51eCIsIl9rZXlVcCIsIl9rZXlEb3duIiwiX2tleVByZXNzIiwiY29tcG9zaXRpb25zdGFydCIsImNvbXBvc2l0aW9udXBkYXRlIiwiY29tcG9zaXRpb25lbmQiLCJfaW5wdXRFdmVudCIsInVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMiLCJwYXJlbnQiLCJpc0Nvbm5lY3RlZCIsIl9sb2dTZXJ2aWNlIiwiZGVidWciLCJvd25lckRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJfZG9jdW1lbnQiLCJkb2N1bWVudE92ZXJyaWRlIiwiRG9jdW1lbnQiLCJkaXIiLCJmcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJfdmlld3BvcnRFbGVtZW50IiwiX3ZpZXdwb3J0U2Nyb2xsQXJlYSIsInVwZGF0ZUN1cnNvclN0eWxlIiwiX2hlbHBlckNvbnRhaW5lciIsImlzQ2hyb21lT1MiLCJDb3JlQnJvd3NlclNlcnZpY2UiLCJfY2hhclNpemVTZXJ2aWNlIiwiQ2hhclNpemVTZXJ2aWNlIiwiSUNoYXJTaXplU2VydmljZSIsIlRoZW1lU2VydmljZSIsIklUaGVtZVNlcnZpY2UiLCJfY2hhcmFjdGVySm9pbmVyU2VydmljZSIsIkNoYXJhY3RlckpvaW5lclNlcnZpY2UiLCJJQ2hhcmFjdGVySm9pbmVyU2VydmljZSIsIlJlbmRlclNlcnZpY2UiLCJyZXNpemUiLCJfY29tcG9zaXRpb25WaWV3IiwiQ29tcG9zaXRpb25IZWxwZXIiLCJNb3VzZVNlcnZpY2UiLCJsaW5raWZpZXIiLCJoYXNSZW5kZXJlciIsInNldFJlbmRlcmVyIiwiX2NyZWF0ZVJlbmRlcmVyIiwidmlld3BvcnQiLCJWaWV3cG9ydCIsIm9uUmVxdWVzdFNjcm9sbExpbmVzIiwiYW1vdW50Iiwic3VwcHJlc3NTY3JvbGxFdmVudCIsIm9uUmVxdWVzdFN5bmNTY3JvbGxCYXIiLCJzeW5jU2Nyb2xsQXJlYSIsImhhbmRsZUN1cnNvck1vdmUiLCJoYW5kbGVSZXNpemUiLCJoYW5kbGVCbHVyIiwiaGFuZGxlRm9jdXMiLCJTZWxlY3Rpb25TZXJ2aWNlIiwiSVNlbGVjdGlvblNlcnZpY2UiLCJvblJlcXVlc3RSZWRyYXciLCJoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkIiwiY29sdW1uU2VsZWN0TW9kZSIsIm9uTGludXhNb3VzZVNlbGVjdGlvbiIsIl9vblNjcm9sbCIsIkJ1ZmZlckRlY29yYXRpb25SZW5kZXJlciIsImhhbmRsZU1vdXNlRG93biIsImNvcmVNb3VzZVNlcnZpY2UiLCJhcmVNb3VzZUV2ZW50c0FjdGl2ZSIsImRpc2FibGUiLCJlbmFibGUiLCJzY3JlZW5SZWFkZXJNb2RlIiwib25TcGVjaWZpY09wdGlvbkNoYW5nZSIsIm92ZXJ2aWV3UnVsZXJXaWR0aCIsIl9vdmVydmlld1J1bGVyUmVuZGVyZXIiLCJPdmVydmlld1J1bGVyUmVuZGVyZXIiLCJtZWFzdXJlIiwiYmluZE1vdXNlIiwiRG9tUmVuZGVyZXIiLCJzZWxmIiwiZWwiLCJzZW5kRXZlbnQiLCJnZXRNb3VzZVJlcG9ydENvb3JkcyIsImJ1dCIsImFjdGlvbiIsIm92ZXJyaWRlVHlwZSIsImJ1dHRvbnMiLCJfY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIiLCJnZXRMaW5lc1Njcm9sbGVkIiwiZGVsdGFZIiwidHJpZ2dlck1vdXNlRXZlbnQiLCJjb2wiLCJjdHJsIiwiY3RybEtleSIsImFsdCIsImFsdEtleSIsInNoaWZ0S2V5IiwicmVxdWVzdGVkRXZlbnRzIiwibW91c2V1cCIsIndoZWVsIiwibW91c2VkcmFnIiwibW91c2Vtb3ZlIiwiZXZlbnRMaXN0ZW5lcnMiLCJjYW5jZWwiLCJvblByb3RvY29sQ2hhbmdlIiwiZXZlbnRzIiwibG9nTGV2ZWwiLCJleHBsYWluRXZlbnRzIiwicGFzc2l2ZSIsImFjdGl2ZVByb3RvY29sIiwic2hvdWxkRm9yY2VTZWxlY3Rpb24iLCJoYXNTY3JvbGxiYWNrIiwic2VxdWVuY2UiLCJhcHBsaWNhdGlvbkN1cnNvcktleXMiLCJkYXRhIiwiYWJzIiwiaGFuZGxlV2hlZWwiLCJoYW5kbGVUb3VjaFN0YXJ0IiwiaGFuZGxlVG91Y2hNb3ZlIiwicmVmcmVzaFJvd3MiLCJzaG91bGRDb2x1bW5TZWxlY3QiLCJpc0N1cnNvckluaXRpYWxpemVkIiwiZGlzcCIsInNvdXJjZSIsImF0dGFjaEN1c3RvbUtleUV2ZW50SGFuZGxlciIsImN1c3RvbUtleUV2ZW50SGFuZGxlciIsImF0dGFjaEN1c3RvbVdoZWVsRXZlbnRIYW5kbGVyIiwiY3VzdG9tV2hlZWxFdmVudEhhbmRsZXIiLCJyZWdpc3RlckNoYXJhY3RlckpvaW5lciIsImpvaW5lcklkIiwiZGVyZWdpc3RlckNoYXJhY3RlckpvaW5lciIsImRlcmVnaXN0ZXIiLCJtYXJrZXJzIiwicmVnaXN0ZXJNYXJrZXIiLCJjdXJzb3JZT2Zmc2V0IiwiYWRkTWFya2VyIiwicmVnaXN0ZXJEZWNvcmF0aW9uIiwiZGVjb3JhdGlvbk9wdGlvbnMiLCJzZXRTZWxlY3Rpb24iLCJnZXRTZWxlY3Rpb25Qb3NpdGlvbiIsInNlbGVjdGlvblN0YXJ0Iiwic2VsZWN0aW9uRW5kIiwic2VsZWN0QWxsIiwic2VsZWN0TGluZXMiLCJzaG91bGRJZ25vcmVDb21wb3NpdGlvbiIsImlzTWFjIiwibWFjT3B0aW9uSXNNZXRhIiwia2V5ZG93biIsInNjcm9sbE9uVXNlcklucHV0Iiwic2Nyb2xsVG9Cb3R0b20iLCJldmFsdWF0ZUtleWJvYXJkRXZlbnQiLCJzY3JvbGxDb3VudCIsIl9pc1RoaXJkTGV2ZWxTaGlmdCIsIm1ldGFLZXkiLCJjaGFyQ29kZUF0IiwiRVRYIiwiQ1IiLCJkb21FdmVudCIsInRoaXJkTGV2ZWxLZXkiLCJpc1dpbmRvd3MiLCJnZXRNb2RpZmllclN0YXRlIiwia2V5Q29kZSIsIndhc01vZGlmaWVyS2V5T25seUV2ZW50IiwiY2hhckNvZGUiLCJ3aGljaCIsIlN0cmluZyIsImZyb21DaGFyQ29kZSIsImlucHV0VHlwZSIsImNvbXBvc2VkIiwiaGFzVmFsaWRTaXplIiwiY2xlYXJBbGxNYXJrZXJzIiwiZ2V0QmxhbmtMaW5lIiwiREVGQVVMVF9BVFRSX0RBVEEiLCJjbGVhclRleHR1cmVBdGxhcyIsIldpbmRvd3NPcHRpb25zUmVwb3J0VHlwZSIsIkdFVF9XSU5fU0laRV9QSVhFTFMiLCJjYW52YXNXaWR0aCIsInRvRml4ZWQiLCJjYW52YXNIZWlnaHQiLCJHRVRfQ0VMTF9TSVpFX1BJWEVMUyIsImZvcmNlIiwiY2FuY2VsRXZlbnRzIiwiX2RlYm91bmNlVGhyZXNob2xkTVMiLCJfbGFzdFJlZnJlc2hNcyIsIl9hZGRpdGlvbmFsUmVmcmVzaFJlcXVlc3RlZCIsIl9yZWZyZXNoVGltZW91dElEIiwiY2xlYXJUaW1lb3V0IiwicmVmcmVzaFJlcXVlc3RUaW1lIiwiRGF0ZSIsIm5vdyIsImVsYXBzZWQiLCJ3YWl0UGVyaW9kQmVmb3JlVHJhaWxpbmdSZWZyZXNoIiwic2V0VGltZW91dCIsIl9zY3JvbGxBcmVhIiwidGhlbWVTZXJ2aWNlIiwic2Nyb2xsQmFyV2lkdGgiLCJfY3VycmVudFJvd0hlaWdodCIsIl9jdXJyZW50RGV2aWNlQ2VsbEhlaWdodCIsIl9sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGgiLCJfbGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQiLCJfbGFzdFJlY29yZGVkQnVmZmVySGVpZ2h0IiwiX2xhc3RUb3VjaFkiLCJfbGFzdFNjcm9sbFRvcCIsIl93aGVlbFBhcnRpYWxTY3JvbGwiLCJfcmVmcmVzaEFuaW1hdGlvbkZyYW1lIiwiX2lnbm9yZU5leHRTY3JvbGxFdmVudCIsIl9zbW9vdGhTY3JvbGxTdGF0ZSIsInN0YXJ0VGltZSIsIm9yaWdpbiIsIl9vblJlcXVlc3RTY3JvbGxMaW5lcyIsIm9mZnNldFdpZHRoIiwiX2hhbmRsZVNjcm9sbCIsIl9hY3RpdmVCdWZmZXIiLCJvbkJ1ZmZlckFjdGl2YXRlIiwiYWN0aXZlQnVmZmVyIiwiX3JlbmRlckRpbWVuc2lvbnMiLCJfaGFuZGxlVGhlbWVDaGFuZ2UiLCJvbkNoYW5nZUNvbG9ycyIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmQiLCJfcmVmcmVzaCIsImltbWVkaWF0ZSIsImRldmljZSIsImRwciIsIm9mZnNldEhlaWdodCIsIm5ld0J1ZmZlckhlaWdodCIsInJvdW5kIiwic2Nyb2xsVG9wIiwib2Zmc2V0UGFyZW50IiwiZGlmZiIsIl9zbW9vdGhTY3JvbGwiLCJfaXNEaXNwb3NlZCIsInBlcmNlbnQiLCJfc21vb3RoU2Nyb2xsUGVyY2VudCIsIl9jbGVhclNtb290aFNjcm9sbFN0YXRlIiwic21vb3RoU2Nyb2xsRHVyYXRpb24iLCJfYnViYmxlU2Nyb2xsIiwic2Nyb2xsUG9zRnJvbVRvcCIsImNhbmNlbGFibGUiLCJfZ2V0UGl4ZWxzU2Nyb2xsZWQiLCJzY3JvbGxIZWlnaHQiLCJfYXBwbHlTY3JvbGxNb2RpZmllciIsImRlbHRhTW9kZSIsIldoZWVsRXZlbnQiLCJET01fREVMVEFfTElORSIsIkRPTV9ERUxUQV9QQUdFIiwiZ2V0QnVmZmVyRWxlbWVudHMiLCJzdGFydExpbmUiLCJlbmRMaW5lIiwiY3Vyc29yRWxlbWVudCIsImN1cnJlbnRMaW5lIiwiYnVmZmVyRWxlbWVudHMiLCJpc1dyYXBwZWQiLCJkaXYiLCJET01fREVMVEFfUElYRUwiLCJmbG9vciIsIm1vZGlmaWVyIiwiZmFzdFNjcm9sbE1vZGlmaWVyIiwiZmFzdFNjcm9sbFNlbnNpdGl2aXR5Iiwic2Nyb2xsU2Vuc2l0aXZpdHkiLCJ0b3VjaGVzIiwicGFnZVkiLCJfc2NyZWVuRWxlbWVudCIsIl9kZWNvcmF0aW9uRWxlbWVudHMiLCJfYWx0QnVmZmVySXNBY3RpdmUiLCJfZGltZW5zaW9uc0NoYW5nZWQiLCJfY29udGFpbmVyIiwiX2RvUmVmcmVzaERlY29yYXRpb25zIiwiX3F1ZXVlUmVmcmVzaCIsIm9uRGVjb3JhdGlvblJlZ2lzdGVyZWQiLCJvbkRlY29yYXRpb25SZW1vdmVkIiwiZGVjb3JhdGlvbiIsIl9yZW1vdmVEZWNvcmF0aW9uIiwiX3JlbmRlckRlY29yYXRpb24iLCJfcmVmcmVzaFN0eWxlIiwiX3JlZnJlc2hYUG9zaXRpb24iLCJfY3JlYXRlRWxlbWVudCIsImxheWVyIiwibWFya2VyIiwiZGlzcGxheSIsIm9uUmVuZGVyRW1pdHRlciIsIm9uRGlzcG9zZSIsImRlbGV0ZSIsImFuY2hvciIsInJpZ2h0IiwiX3pvbmVzIiwiX3pvbmVQb29sIiwiX3pvbmVQb29sSW5kZXgiLCJfbGluZVBhZGRpbmciLCJmdWxsIiwiY2VudGVyIiwiem9uZXMiLCJhZGREZWNvcmF0aW9uIiwib3ZlcnZpZXdSdWxlck9wdGlvbnMiLCJ6IiwiX2xpbmVJbnRlcnNlY3RzWm9uZSIsIl9saW5lQWRqYWNlbnRUb1pvbmUiLCJfYWRkTGluZVRvWm9uZSIsInN0YXJ0QnVmZmVyTGluZSIsImVuZEJ1ZmZlckxpbmUiLCJzZXRQYWRkaW5nIiwicGFkZGluZyIsInpvbmUiLCJkcmF3SGVpZ2h0IiwiZHJhd1dpZHRoIiwiZHJhd1giLCJfd2lkdGgiLCJfY29sb3Jab25lU3RvcmUiLCJDb2xvclpvbmVTdG9yZSIsIl9zaG91bGRVcGRhdGVEaW1lbnNpb25zIiwiX3Nob3VsZFVwZGF0ZUFuY2hvciIsIl9sYXN0S25vd25CdWZmZXJMZW5ndGgiLCJfY2FudmFzIiwiX3JlZnJlc2hDYW52YXNEaW1lbnNpb25zIiwicGFyZW50RWxlbWVudCIsImluc2VydEJlZm9yZSIsImN0eCIsImdldENvbnRleHQiLCJfY3R4IiwiX3JlZ2lzdGVyRGVjb3JhdGlvbkxpc3RlbmVycyIsIl9yZWdpc3RlckJ1ZmZlckNoYW5nZUxpc3RlbmVycyIsIl9yZWdpc3RlckRpbWVuc2lvbkNoYW5nZUxpc3RlbmVycyIsIm5vcm1hbCIsIl9yZWZyZXNoRHJhd0hlaWdodENvbnN0YW50cyIsIl9yZWZyZXNoQ29sb3Jab25lUGFkZGluZyIsIl9jb250YWluZXJIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJfcmVmcmVzaERyYXdDb25zdGFudHMiLCJvdXRlcldpZHRoIiwiaW5uZXJXaWR0aCIsImNlaWwiLCJwaXhlbHNQZXJMaW5lIiwibm9uRnVsbEhlaWdodCIsIl9yZWZyZXNoRGVjb3JhdGlvbnMiLCJjbGVhclJlY3QiLCJsaW5lV2lkdGgiLCJfcmVuZGVyQ29sb3Jab25lIiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJ1cGRhdGVDYW52YXNEaW1lbnNpb25zIiwidXBkYXRlQW5jaG9yIiwiX2lzQ29tcG9zaW5nIiwiX3RleHRhcmVhIiwiX2NvcmVTZXJ2aWNlIiwiX2lzU2VuZGluZ0NvbXBvc2l0aW9uIiwiX2NvbXBvc2l0aW9uUG9zaXRpb24iLCJfZGF0YUFscmVhZHlTZW50IiwiX2ZpbmFsaXplQ29tcG9zaXRpb24iLCJfaGFuZGxlQW55VGV4dGFyZWFDaGFuZ2VzIiwid2FpdEZvclByb3BhZ2F0aW9uIiwiY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb24iLCJpbnB1dCIsInN1YnN0cmluZyIsIm9sZFZhbHVlIiwibmV3VmFsdWUiLCJERUwiLCJkb250UmVjdXJzZSIsImZvbnRGYW1pbHkiLCJmb250U2l6ZSIsImNvbXBvc2l0aW9uVmlld0JvdW5kcyIsIklDb3JlU2VydmljZSIsImdldENvb3Jkc1JlbGF0aXZlVG9FbGVtZW50IiwicmVjdCIsImVsZW1lbnRTdHlsZSIsImdldENvbXB1dGVkU3R5bGUiLCJsZWZ0UGFkZGluZyIsImdldFByb3BlcnR5VmFsdWUiLCJ0b3BQYWRkaW5nIiwiY29sQ291bnQiLCJoYXNWYWxpZENoYXJTaXplIiwiY3NzQ2VsbFdpZHRoIiwiY3NzQ2VsbEhlaWdodCIsImlzU2VsZWN0aW9uIiwibW92ZVRvUmVxdWVzdGVkUm93Iiwic3RhcnRZIiwidGFyZ2V0WSIsImJ1ZmZlclNlcnZpY2UiLCJhcHBsaWNhdGlvbkN1cnNvciIsIndyYXBwZWRSb3dzRm9yUm93Iiwicm93c1RvTW92ZSIsIndyYXBwZWRSb3dzIiwiZGlyZWN0aW9uIiwidmVydGljYWxEaXJlY3Rpb24iLCJ3cmFwcGVkUm93c0NvdW50IiwicmVwZWF0IiwiY3VycmVudFJvdyIsImxpbmVXcmFwcyIsInN0YXJ0Q29sIiwiZW5kQ29sIiwiZm9yd2FyZCIsImN1cnJlbnRDb2wiLCJidWZmZXJTdHIiLCJ0cmFuc2xhdGVCdWZmZXJMaW5lVG9TdHJpbmciLCJtb2QiLCJjb3VudCIsInN0ciIsInJwdCIsInRhcmdldFgiLCJyZXNldFN0YXJ0aW5nUm93IiwiaG9yaXpvbnRhbERpcmVjdGlvbiIsIm1vdmVUb1JlcXVlc3RlZENvbCIsInJvd0RpZmZlcmVuY2UiLCJjdXJyWCIsImNvbHNGcm9tUm93RW5kIiwiVEVSTUlOQUxfQ0xBU1NfUFJFRklYIiwiUk9XX0NPTlRBSU5FUl9DTEFTUyIsIkZHX0NMQVNTX1BSRUZJWCIsIkJHX0NMQVNTX1BSRUZJWCIsIkZPQ1VTX0NMQVNTIiwiU0VMRUNUSU9OX0NMQVNTIiwibmV4dFRlcm1pbmFsSWQiLCJfbGlua2lmaWVyMiIsIl90ZXJtaW5hbENsYXNzIiwiX3NlbGVjdGlvblJlbmRlck1vZGVsIiwiY3JlYXRlU2VsZWN0aW9uUmVuZGVyTW9kZWwiLCJfcmVmcmVzaFJvd0VsZW1lbnRzIiwiX3NlbGVjdGlvbkNvbnRhaW5lciIsImNyZWF0ZVJlbmRlckRpbWVuc2lvbnMiLCJfdXBkYXRlRGltZW5zaW9ucyIsIm9uT3B0aW9uQ2hhbmdlIiwiX2hhbmRsZU9wdGlvbnNDaGFuZ2VkIiwiX2luamVjdENzcyIsIl9yb3dGYWN0b3J5IiwiRG9tUmVuZGVyZXJSb3dGYWN0b3J5IiwiX2hhbmRsZUxpbmtIb3ZlciIsIl9oYW5kbGVMaW5rTGVhdmUiLCJfd2lkdGhDYWNoZSIsIl90aGVtZVN0eWxlRWxlbWVudCIsIl9kaW1lbnNpb25zU3R5bGVFbGVtZW50IiwiV2lkdGhDYWNoZSIsInNldEZvbnQiLCJmb250V2VpZ2h0IiwiZm9udFdlaWdodEJvbGQiLCJfc2V0RGVmYXVsdFNwYWNpbmciLCJsZXR0ZXJTcGFjaW5nIiwib3ZlcmZsb3ciLCJzdHlsZXMiLCJfdGVybWluYWxTZWxlY3RvciIsImZvcmVncm91bmQiLCJtdWx0aXBseU9wYWNpdHkiLCJibGlua0FuaW1hdGlvblVuZGVybGluZUlkIiwiYmxpbmtBbmltYXRpb25CYXJJZCIsImJsaW5rQW5pbWF0aW9uQmxvY2tJZCIsImN1cnNvciIsImN1cnNvckFjY2VudCIsImN1cnNvcldpZHRoIiwic2VsZWN0aW9uQmFja2dyb3VuZE9wYXF1ZSIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZE9wYXF1ZSIsImMiLCJJTlZFUlRFRF9ERUZBVUxUX0NPTE9SIiwib3BhcXVlIiwic3BhY2luZyIsImRlZmF1bHRTcGFjaW5nIiwiaGFuZGxlRGV2aWNlUGl4ZWxSYXRpb0NoYW5nZSIsImhhbmRsZUNoYXJTaXplQ2hhbmdlZCIsInJlbmRlclJvd3MiLCJyZXBsYWNlQ2hpbGRyZW4iLCJ1cGRhdGUiLCJ2aWV3cG9ydFN0YXJ0Um93Iiwidmlld3BvcnRFbmRSb3ciLCJ2aWV3cG9ydENhcHBlZFN0YXJ0Um93Iiwidmlld3BvcnRDYXBwZWRFbmRSb3ciLCJkb2N1bWVudEZyYWdtZW50IiwiaXNYRmxpcHBlZCIsIl9jcmVhdGVTZWxlY3Rpb25FbGVtZW50IiwibWlkZGxlUm93c0NvdW50IiwiY29sU3RhcnQiLCJjb2xFbmQiLCJjdXJzb3JBYnNvbHV0ZVkiLCJjdXJzb3JCbGluayIsImN1cnNvclN0eWxlIiwiY3Vyc29ySW5hY3RpdmVTdHlsZSIsImNyZWF0ZVJvdyIsIl9zZXRDZWxsVW5kZXJsaW5lIiwiZW5hYmxlZCIsIm1heFkiLCJidWZmZXJsaW5lIiwiX3dvcmtDZWxsIiwiX2NvbHVtblNlbGVjdE1vZGUiLCJfc2VsZWN0aW9uU3RhcnQiLCJfc2VsZWN0aW9uRW5kIiwiaXNDdXJzb3JSb3ciLCJ3aWR0aENhY2hlIiwibGlua1N0YXJ0IiwibGlua0VuZCIsImVsZW1lbnRzIiwiam9pbmVkUmFuZ2VzIiwiZ2V0Sm9pbmVkQ2hhcmFjdGVycyIsImNoYXJFbGVtZW50IiwiZ2V0Tm9CZ1RyaW1tZWRMZW5ndGgiLCJjZWxsQW1vdW50Iiwib2xkQmciLCJvbGRGZyIsIm9sZEV4dCIsIm9sZExpbmtIb3ZlciIsIm9sZFNwYWNpbmciLCJvbGRJc0luU2VsZWN0aW9uIiwiY2xhc3NlcyIsImhhc0hvdmVyIiwiaXNKb2luZWQiLCJsYXN0Q2hhclgiLCJKb2luZWRDZWxsRGF0YSIsImlzSW5TZWxlY3Rpb24iLCJfaXNDZWxsSW5TZWxlY3Rpb24iLCJpc0N1cnNvckNlbGwiLCJpc0xpbmtIb3ZlciIsImlzRGVjb3JhdGVkIiwiZm9yRWFjaERlY29yYXRpb25BdENlbGwiLCJkIiwiY2hhcnMiLCJnZXRDaGFycyIsIldISVRFU1BBQ0VfQ0VMTF9DSEFSIiwiaXNVbmRlcmxpbmUiLCJpc092ZXJsaW5lIiwiaXNCb2xkIiwiaXNJdGFsaWMiLCJzZWxlY3Rpb25Gb3JlZ3JvdW5kIiwiZXh0IiwiaXNJbnZpc2libGUiLCJpc0N1cnNvckhpZGRlbiIsImlzRm9jdXNlZCIsImlzRGltIiwidW5kZXJsaW5lU3R5bGUiLCJpc1VuZGVybGluZUNvbG9yRGVmYXVsdCIsImlzVW5kZXJsaW5lQ29sb3JSR0IiLCJ0ZXh0RGVjb3JhdGlvbkNvbG9yIiwiQXR0cmlidXRlRGF0YSIsImdldFVuZGVybGluZUNvbG9yIiwiam9pbiIsImRyYXdCb2xkVGV4dEluQnJpZ2h0Q29sb3JzIiwiaXNTdHJpa2V0aHJvdWdoIiwidGV4dERlY29yYXRpb24iLCJnZXRGZ0NvbG9yIiwiZmdDb2xvck1vZGUiLCJnZXRGZ0NvbG9yTW9kZSIsImdldEJnQ29sb3IiLCJiZ0NvbG9yTW9kZSIsImdldEJnQ29sb3JNb2RlIiwiaXNJbnZlcnNlIiwidGVtcCIsInRlbXAyIiwiYmdPdmVycmlkZSIsImZnT3ZlcnJpZGUiLCJyZXNvbHZlZEJnIiwiaXNUb3AiLCJiYWNrZ3JvdW5kQ29sb3JSR0IiLCJyZ2JhIiwiZm9yZWdyb3VuZENvbG9yUkdCIiwiX2FkZFN0eWxlIiwicGFkU3RhcnQiLCJfYXBwbHlNaW5pbXVtQ29udHJhc3QiLCJjbGFzc05hbWUiLCJtaW5pbXVtQ29udHJhc3RSYXRpbyIsInRyZWF0R2x5cGhBc0JhY2tncm91bmRDb2xvciIsImdldENvZGUiLCJjYWNoZSIsIl9nZXRDb250cmFzdENhY2hlIiwiYWRqdXN0ZWRDb2xvciIsInJhdGlvIiwiZW5zdXJlQ29udHJhc3RSYXRpbyIsImhhbGZDb250cmFzdENhY2hlIiwiY29udHJhc3RDYWNoZSIsInBhZENoYXIiLCJfZmxhdCIsIkZsb2F0MzJBcnJheSIsIl9mb250IiwiX2ZvbnRTaXplIiwiX3dlaWdodCIsIl93ZWlnaHRCb2xkIiwiX21lYXN1cmVFbGVtZW50cyIsIndoaXRlU3BhY2UiLCJmb250S2VybmluZyIsInJlZ3VsYXIiLCJib2xkIiwiaXRhbGljIiwiZm9udFN0eWxlIiwiYm9sZEl0YWxpYyIsIl9ob2xleSIsImZpbGwiLCJmb250Iiwid2VpZ2h0Iiwid2VpZ2h0Qm9sZCIsImNwIiwiX21lYXN1cmUiLCJ2YXJpYW50IiwiRElNX09QQUNJVFkiLCJURVhUX0JBU0VMSU5FIiwiaXNMZWdhY3lFZGdlIiwiaXNQb3dlcmxpbmVHbHlwaCIsImNvZGVwb2ludCIsImlzRW1vamkiLCJnbHlwaFNpemVYIiwiZGV2aWNlQ2VsbFdpZHRoIiwiaXNOZXJkRm9udEdseXBoIiwiaXNCb3hPckJsb2NrR2x5cGgiLCJjdXJyZW50T2Zmc2V0IiwiU2VsZWN0aW9uUmVuZGVyTW9kZWwiLCJ0ZXJtaW5hbCIsInZpZXdwb3J0WSIsImlzQ2VsbFNlbGVjdGVkIiwiaXNTZWxlY3RBbGxBY3RpdmUiLCJzZWxlY3Rpb25TdGFydExlbmd0aCIsImZpbmFsU2VsZWN0aW9uU3RhcnQiLCJhcmVTZWxlY3Rpb25WYWx1ZXNSZXZlcnNlZCIsImZpbmFsU2VsZWN0aW9uRW5kIiwic3RhcnRQbHVzTGVuZ3RoIiwiaGFuZGxlVHJpbSIsIl9vbkNoYXJTaXplQ2hhbmdlIiwib25DaGFyU2l6ZUNoYW5nZSIsIl9tZWFzdXJlU3RyYXRlZ3kiLCJUZXh0TWV0cmljc01lYXN1cmVTdHJhdGVneSIsIkRvbU1lYXN1cmVTdHJhdGVneSIsIm9uTXVsdGlwbGVPcHRpb25DaGFuZ2UiLCJCYXNlTWVhc3VyZVN0YXRlZ3kiLCJfcmVzdWx0IiwiX3ZhbGlkYXRlQW5kU2V0IiwiX3BhcmVudEVsZW1lbnQiLCJfbWVhc3VyZUVsZW1lbnQiLCJOdW1iZXIiLCJPZmZzY3JlZW5DYW52YXMiLCJtZWFzdXJlVGV4dCIsIm1ldHJpY3MiLCJmb250Qm91bmRpbmdCb3hBc2NlbnQiLCJmb250Qm91bmRpbmdCb3hEZXNjZW50IiwiZmlyc3RDZWxsIiwiY29udGVudCIsImNvbWJpbmVkRGF0YSIsImlzQ29tYmluZWQiLCJzZXRGcm9tQ2hhckRhdGEiLCJnZXRBc0NoYXJEYXRhIiwiX2NoYXJhY3RlckpvaW5lcnMiLCJfbmV4dENoYXJhY3RlckpvaW5lcklkIiwiam9pbmVyIiwiaWQiLCJyYW5nZXMiLCJsaW5lU3RyIiwicmFuZ2VTdGFydENvbHVtbiIsImN1cnJlbnRTdHJpbmdJbmRleCIsInJhbmdlU3RhcnRTdHJpbmdJbmRleCIsInJhbmdlQXR0ckZHIiwiZ2V0RmciLCJyYW5nZUF0dHJCRyIsImdldEJnIiwiX2dldEpvaW5lZFJhbmdlcyIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsImFsbEpvaW5lZFJhbmdlcyIsImpvaW5lclJhbmdlcyIsIl9tZXJnZVJhbmdlcyIsIl9zdHJpbmdSYW5nZXNUb0NlbGxSYW5nZXMiLCJjdXJyZW50UmFuZ2VJbmRleCIsImN1cnJlbnRSYW5nZVN0YXJ0ZWQiLCJjdXJyZW50UmFuZ2UiLCJnZXRTdHJpbmciLCJuZXdSYW5nZSIsImluUmFuZ2UiLCJfd2luZG93IiwiX2lzRm9jdXNlZCIsIl9jYWNoZWRJc0ZvY3VzZWQiLCJfc2NyZWVuRHByTW9uaXRvciIsIlNjcmVlbkRwck1vbml0b3IiLCJfb25EcHJDaGFuZ2UiLCJfb25XaW5kb3dDaGFuZ2UiLCJvbldpbmRvd0NoYW5nZSIsInciLCJzZXRXaW5kb3ciLCJkZXZpY2VQaXhlbFJhdGlvIiwiaGFzRm9jdXMiLCJxdWV1ZU1pY3JvdGFzayIsIl9wYXJlbnRXaW5kb3ciLCJfd2luZG93UmVzaXplTGlzdGVuZXIiLCJfb3V0ZXJMaXN0ZW5lciIsIl9zZXREcHJBbmRGaXJlSWZEaWZmZXJzIiwiX2N1cnJlbnREZXZpY2VQaXhlbFJhdGlvIiwiX3VwZGF0ZURwciIsIl9zZXRXaW5kb3dSZXNpemVMaXN0ZW5lciIsImNsZWFyTGlzdGVuZXIiLCJwYXJlbnRXaW5kb3ciLCJfcmVzb2x1dGlvbk1lZGlhTWF0Y2hMaXN0IiwicmVtb3ZlTGlzdGVuZXIiLCJtYXRjaE1lZGlhIiwiYWRkTGlzdGVuZXIiLCJwcm92aWRlckluZGV4IiwiaW5kZXhPZiIsIl9yZW5kZXJlciIsImRlY29yYXRpb25TZXJ2aWNlIiwiY29yZUJyb3dzZXJTZXJ2aWNlIiwiX3BhdXNlZFJlc2l6ZVRhc2siLCJEZWJvdW5jZWRJZGxlVGFzayIsIl9vYnNlcnZlckRpc3Bvc2FibGUiLCJfaXNQYXVzZWQiLCJfbmVlZHNGdWxsUmVmcmVzaCIsIl9pc05leHRSZW5kZXJSZWRyYXdPbmx5IiwiX25lZWRzU2VsZWN0aW9uUmVmcmVzaCIsIl9jYW52YXNXaWR0aCIsIl9jYW52YXNIZWlnaHQiLCJfc2VsZWN0aW9uU3RhdGUiLCJfb25EaW1lbnNpb25zQ2hhbmdlIiwiX29uUmVuZGVyZWRWaWV3cG9ydENoYW5nZSIsIl9vblJlZnJlc2hSZXF1ZXN0Iiwib25SZWZyZXNoUmVxdWVzdCIsIl9yZW5kZXJEZWJvdW5jZXIiLCJSZW5kZXJEZWJvdW5jZXIiLCJfZnVsbFJlZnJlc2giLCJfcmVnaXN0ZXJJbnRlcnNlY3Rpb25PYnNlcnZlciIsIm9ic2VydmVyIiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJfaGFuZGxlSW50ZXJzZWN0aW9uQ2hhbmdlIiwidGhyZXNob2xkIiwib2JzZXJ2ZSIsImRpc2Nvbm5lY3QiLCJlbnRyeSIsImlzSW50ZXJzZWN0aW5nIiwiaW50ZXJzZWN0aW9uUmF0aW8iLCJmbHVzaCIsImlzUmVkcmF3T25seSIsIl9maXJlT25DYW52YXNSZXNpemUiLCJyZW5kZXJlciIsIk5PTl9CUkVBS0lOR19TUEFDRV9DSEFSIiwiQUxMX05PTl9CUkVBS0lOR19TUEFDRV9SRUdFWCIsIlJlZ0V4cCIsIl9saW5raWZpZXIiLCJfZHJhZ1Njcm9sbEFtb3VudCIsIl9lbmFibGVkIiwiX21vdXNlRG93blRpbWVTdGFtcCIsIl9vbGRIYXNTZWxlY3Rpb24iLCJfb2xkU2VsZWN0aW9uU3RhcnQiLCJfb2xkU2VsZWN0aW9uRW5kIiwiX29uTGludXhNb3VzZVNlbGVjdGlvbiIsIl9vblJlZHJhd1JlcXVlc3QiLCJfbW91c2VNb3ZlTGlzdGVuZXIiLCJfbW91c2VVcExpc3RlbmVyIiwib25Vc2VySW5wdXQiLCJfdHJpbUxpc3RlbmVyIiwib25UcmltIiwiX2hhbmRsZVRyaW0iLCJfaGFuZGxlQnVmZmVyQWN0aXZhdGUiLCJfbW9kZWwiLCJTZWxlY3Rpb25Nb2RlbCIsIl9hY3RpdmVTZWxlY3Rpb25Nb2RlIiwiX3JlbW92ZU1vdXNlRG93bkxpc3RlbmVycyIsImxpbmVUZXh0Iiwic3RhcnRSb3dFbmRDb2wiLCJpc0xpbnV4TW91c2VTZWxlY3Rpb24iLCJfaXNDbGlja0luU2VsZWN0aW9uIiwiX2dldE1vdXNlQnVmZmVyQ29vcmRzIiwiX2FyZUNvb3Jkc0luU2VsZWN0aW9uIiwiaXNDZWxsSW5TZWxlY3Rpb24iLCJfc2VsZWN0V29yZEF0Q3Vyc29yIiwiYWxsb3dXaGl0ZXNwYWNlT25seVNlbGVjdGlvbiIsImdldFJhbmdlTGVuZ3RoIiwiX3NlbGVjdFdvcmRBdCIsIl9nZXRNb3VzZUV2ZW50U2Nyb2xsQW1vdW50IiwidGVybWluYWxIZWlnaHQiLCJtYWNPcHRpb25DbGlja0ZvcmNlc1NlbGVjdGlvbiIsInRpbWVTdGFtcCIsIl9oYW5kbGVJbmNyZW1lbnRhbENsaWNrIiwiZGV0YWlsIiwiX2hhbmRsZVNpbmdsZUNsaWNrIiwiX2hhbmRsZURvdWJsZUNsaWNrIiwiX2hhbmRsZVRyaXBsZUNsaWNrIiwiX2FkZE1vdXNlRG93bkxpc3RlbmVycyIsIl9kcmFnU2Nyb2xsSW50ZXJ2YWxUaW1lciIsInNldEludGVydmFsIiwiX2RyYWdTY3JvbGwiLCJjbGVhckludGVydmFsIiwiaGFzV2lkdGgiLCJfc2VsZWN0TGluZUF0IiwicHJldmlvdXNTZWxlY3Rpb25FbmQiLCJfc2VsZWN0VG9Xb3JkQXQiLCJ0aW1lRWxhcHNlZCIsImFsdENsaWNrTW92ZXNDdXJzb3IiLCJjb29yZGluYXRlcyIsIm1vdmVUb0NlbGxTZXF1ZW5jZSIsIl9maXJlRXZlbnRJZlNlbGVjdGlvbkNoYW5nZWQiLCJfZmlyZU9uU2VsZWN0aW9uQ2hhbmdlIiwiX2NvbnZlcnRWaWV3cG9ydENvbFRvQ2hhcmFjdGVySW5kZXgiLCJjaGFySW5kZXgiLCJfZ2V0V29yZEF0IiwiZm9sbG93V3JhcHBlZExpbmVzQWJvdmUiLCJmb2xsb3dXcmFwcGVkTGluZXNCZWxvdyIsImNoYXJPZmZzZXQiLCJsZWZ0V2lkZUNoYXJDb3VudCIsInJpZ2h0V2lkZUNoYXJDb3VudCIsImxlZnRMb25nQ2hhck9mZnNldCIsInJpZ2h0TG9uZ0NoYXJPZmZzZXQiLCJjaGFyQXQiLCJfaXNDaGFyV29yZFNlcGFyYXRvciIsInRyaW0iLCJnZXRDb2RlUG9pbnQiLCJwcmV2aW91c0J1ZmZlckxpbmUiLCJwcmV2aW91c0xpbmVXb3JkUG9zaXRpb24iLCJuZXh0QnVmZmVyTGluZSIsIm5leHRMaW5lV29yZFBvc2l0aW9uIiwid29yZFBvc2l0aW9uIiwid29yZFNlcGFyYXRvciIsIndyYXBwZWRSYW5nZSIsImdldFdyYXBwZWRSYW5nZUZvckxpbmUiLCJmaXJzdCIsImxhc3QiLCJjcmVhdGVEZWNvcmF0b3IiLCJERUZBVUxUX0ZPUkVHUk9VTkQiLCJERUZBVUxUX0JBQ0tHUk9VTkQiLCJERUZBVUxUX0NVUlNPUiIsIkRFRkFVTFRfQ1VSU09SX0FDQ0VOVCIsIkRFRkFVTFRfU0VMRUNUSU9OIiwiREVGQVVMVF9BTlNJX0NPTE9SUyIsImZyZWV6ZSIsInIiLCJnIiwiYiIsInRvQ3NzIiwidG9SZ2JhIiwiX2NvbG9ycyIsIl9jb250cmFzdENhY2hlIiwiQ29sb3JDb250cmFzdENhY2hlIiwiX2hhbGZDb250cmFzdENhY2hlIiwiX29uQ2hhbmdlQ29sb3JzIiwic2VsZWN0aW9uQmFja2dyb3VuZFRyYW5zcGFyZW50IiwiYmxlbmQiLCJzZWxlY3Rpb25JbmFjdGl2ZUJhY2tncm91bmRUcmFuc3BhcmVudCIsIl91cGRhdGVSZXN0b3JlQ29sb3JzIiwiX3NldFRoZW1lIiwidGhlbWUiLCJwYXJzZUNvbG9yIiwic2VsZWN0aW9uQmFja2dyb3VuZCIsInNlbGVjdGlvbkluYWN0aXZlQmFja2dyb3VuZCIsIk5VTExfQ09MT1IiLCJpc09wYXF1ZSIsIm9wYWNpdHkiLCJibGFjayIsInJlZCIsImdyZWVuIiwieWVsbG93IiwiYmx1ZSIsIm1hZ2VudGEiLCJjeWFuIiwid2hpdGUiLCJicmlnaHRCbGFjayIsImJyaWdodFJlZCIsImJyaWdodEdyZWVuIiwiYnJpZ2h0WWVsbG93IiwiYnJpZ2h0Qmx1ZSIsImJyaWdodE1hZ2VudGEiLCJicmlnaHRDeWFuIiwiYnJpZ2h0V2hpdGUiLCJleHRlbmRlZEFuc2kiLCJjb2xvckNvdW50Iiwic2xvdCIsIl9yZXN0b3JlQ29sb3IiLCJfcmVzdG9yZUNvbG9ycyIsImNzc1N0cmluZyIsImZhbGxiYWNrIiwiQ2lyY3VsYXJMaXN0IiwiX21heExlbmd0aCIsIm9uRGVsZXRlRW1pdHRlciIsIm9uRGVsZXRlIiwib25JbnNlcnRFbWl0dGVyIiwib25JbnNlcnQiLCJvblRyaW1FbWl0dGVyIiwiX2FycmF5IiwiQXJyYXkiLCJfc3RhcnRJbmRleCIsIl9sZW5ndGgiLCJtYXhMZW5ndGgiLCJuZXdNYXhMZW5ndGgiLCJuZXdBcnJheSIsIl9nZXRDeWNsaWNJbmRleCIsIm5ld0xlbmd0aCIsInJlY3ljbGUiLCJpc0Z1bGwiLCJkZWxldGVDb3VudCIsIml0ZW1zIiwiY291bnRUb1RyaW0iLCJ0cmltU3RhcnQiLCJzaGlmdEVsZW1lbnRzIiwiZXhwYW5kTGlzdEJ5IiwiY2xvbmUiLCJ2YWwiLCJkZXB0aCIsImNsb25lZE9iamVjdCIsImlzQXJyYXkiLCIkciIsIiRnIiwiJGIiLCIkYSIsInJnYiIsInRvUGFkZGVkSGV4IiwicyIsImNvbnRyYXN0UmF0aW8iLCJsMSIsImwyIiwidG9DaGFubmVscyIsImZnUiIsImZnRyIsImZnQiIsImJnUiIsImJnRyIsImJnQiIsInJnYmFDb2xvciIsImZhY3RvciIsIiRjdHgiLCIkbGl0bXVzQ29sb3IiLCJ3aWxsUmVhZEZyZXF1ZW50bHkiLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJjcmVhdGVMaW5lYXJHcmFkaWVudCIsIm1hdGNoIiwicmdiYU1hdGNoIiwicGFyc2VGbG9hdCIsImdldEltYWdlRGF0YSIsInJlbGF0aXZlTHVtaW5hbmNlMiIsInJzIiwiZ3MiLCJicyIsInBvdyIsInJlbGF0aXZlTHVtaW5hbmNlIiwicmVkdWNlTHVtaW5hbmNlIiwiYmdSZ2JhIiwiZmdSZ2JhIiwiY3IiLCJpbmNyZWFzZUx1bWluYW5jZSIsImJnTCIsImZnTCIsInJlc3VsdEEiLCJyZXN1bHRBUmF0aW8iLCJyZXN1bHRCIiwiaGFzV3JpdGVTeW5jV2FybkhhcHBlbmVkIiwiX29uU2Nyb2xsQXBpIiwiX3dpbmRvd3NXcmFwcGluZ0hldXJpc3RpY3MiLCJfb25CaW5hcnkiLCJvbkJpbmFyeSIsIl9vbkRhdGEiLCJvbkRhdGEiLCJfb25MaW5lRmVlZCIsIl9vblJlc2l6ZSIsIl9vbldyaXRlUGFyc2VkIiwib25Xcml0ZVBhcnNlZCIsIkluc3RhbnRpYXRpb25TZXJ2aWNlIiwiT3B0aW9uc1NlcnZpY2UiLCJCdWZmZXJTZXJ2aWNlIiwiTG9nU2VydmljZSIsIklMb2dTZXJ2aWNlIiwiQ29yZVNlcnZpY2UiLCJDb3JlTW91c2VTZXJ2aWNlIiwiSUNvcmVNb3VzZVNlcnZpY2UiLCJ1bmljb2RlU2VydmljZSIsIlVuaWNvZGVTZXJ2aWNlIiwiSVVuaWNvZGVTZXJ2aWNlIiwiX2NoYXJzZXRTZXJ2aWNlIiwiQ2hhcnNldFNlcnZpY2UiLCJJQ2hhcnNldFNlcnZpY2UiLCJPc2NMaW5rU2VydmljZSIsIklucHV0SGFuZGxlciIsIm9uUmVxdWVzdFNjcm9sbFRvQm90dG9tIiwiX3dyaXRlQnVmZmVyIiwiaGFuZGxlVXNlcklucHV0IiwiX2hhbmRsZVdpbmRvd3NQdHlPcHRpb25DaGFuZ2UiLCJtYXJrUmFuZ2VEaXJ0eSIsInNjcm9sbEJvdHRvbSIsIldyaXRlQnVmZmVyIiwicHJvbWlzZVJlc3VsdCIsInBhcnNlIiwid3JpdGUiLCJ3cml0ZVN5bmMiLCJtYXhTdWJzZXF1ZW50Q2FsbHMiLCJMb2dMZXZlbEVudW0iLCJXQVJOIiwid2FzVXNlcklucHV0IiwiTUlOSU1VTV9DT0xTIiwiTUlOSU1VTV9ST1dTIiwic2Nyb2xsIiwiZXJhc2VBdHRyIiwic2Nyb2xsUGFnZXMiLCJwYWdlQ291bnQiLCJzY3JvbGxUb1RvcCIsInNjcm9sbFRvTGluZSIsInNjcm9sbEFtb3VudCIsInJlZ2lzdGVyRXNjSGFuZGxlciIsInJlZ2lzdGVyRGNzSGFuZGxlciIsInJlZ2lzdGVyQ3NpSGFuZGxlciIsInJlZ2lzdGVyT3NjSGFuZGxlciIsIndpbmRvd3NQdHkiLCJidWlsZE51bWJlciIsImJhY2tlbmQiLCJ3aW5kb3dzTW9kZSIsIl9lbmFibGVXaW5kb3dzV3JhcHBpbmdIZXVyaXN0aWNzIiwiZGlzcG9zYWJsZXMiLCJ1cGRhdGVXaW5kb3dzTW9kZVdyYXBwZWRTdGF0ZSIsImZpbmFsIiwiX2xpc3RlbmVycyIsIl9kaXNwb3NlZCIsIl9ldmVudCIsImxpc3RlbmVyIiwiYXJnMSIsImFyZzIiLCJxdWV1ZSIsImNhbGwiLCJjbGVhckxpc3RlbmVycyIsImZyb20iLCJ0byIsIkdMRVZFTCIsIk1BWF9QQVJTRUJVRkZFUl9MRU5HVEgiLCJwYXJhbVRvV2luZG93T3B0aW9uIiwibiIsIm9wdHMiLCJzZXRXaW5MaW5lcyIsInJlc3RvcmVXaW4iLCJtaW5pbWl6ZVdpbiIsInNldFdpblBvc2l0aW9uIiwic2V0V2luU2l6ZVBpeGVscyIsInJhaXNlV2luIiwibG93ZXJXaW4iLCJyZWZyZXNoV2luIiwic2V0V2luU2l6ZUNoYXJzIiwibWF4aW1pemVXaW4iLCJmdWxsc2NyZWVuV2luIiwiZ2V0V2luU3RhdGUiLCJnZXRXaW5Qb3NpdGlvbiIsImdldFdpblNpemVQaXhlbHMiLCJnZXRTY3JlZW5TaXplUGl4ZWxzIiwiZ2V0Q2VsbFNpemVQaXhlbHMiLCJnZXRXaW5TaXplQ2hhcnMiLCJnZXRTY3JlZW5TaXplQ2hhcnMiLCJnZXRJY29uVGl0bGUiLCJnZXRXaW5UaXRsZSIsInB1c2hUaXRsZSIsInBvcFRpdGxlIiwiJHRlbXAiLCJnZXRBdHRyRGF0YSIsIl9jdXJBdHRyRGF0YSIsIl9jb3JlTW91c2VTZXJ2aWNlIiwiX3VuaWNvZGVTZXJ2aWNlIiwiX3BhcnNlciIsIkVzY2FwZVNlcXVlbmNlUGFyc2VyIiwiX3BhcnNlQnVmZmVyIiwiVWludDMyQXJyYXkiLCJfc3RyaW5nRGVjb2RlciIsIlN0cmluZ1RvVXRmMzIiLCJfdXRmOERlY29kZXIiLCJVdGY4VG9VdGYzMiIsIl93aW5kb3dUaXRsZSIsIl9pY29uTmFtZSIsIl93aW5kb3dUaXRsZVN0YWNrIiwiX2ljb25OYW1lU3RhY2siLCJfZXJhc2VBdHRyRGF0YUludGVybmFsIiwiX29uUmVxdWVzdEJlbGwiLCJfb25SZXF1ZXN0UmVmcmVzaFJvd3MiLCJfb25SZXF1ZXN0UmVzZXQiLCJfb25SZXF1ZXN0U2VuZEZvY3VzIiwiX29uUmVxdWVzdFN5bmNTY3JvbGxCYXIiLCJfb25SZXF1ZXN0V2luZG93c09wdGlvbnNSZXBvcnQiLCJfb25BMTF5Q2hhciIsIl9vbkExMXlUYWIiLCJfb25Db2xvciIsIl9wYXJzZVN0YWNrIiwicGF1c2VkIiwiY3Vyc29yU3RhcnRYIiwiY3Vyc29yU3RhcnRZIiwiZGVjb2RlZExlbmd0aCIsIl9zcGVjaWFsQ29sb3JzIiwiX2RpcnR5Um93VHJhY2tlciIsIkRpcnR5Um93VHJhY2tlciIsInNldENzaUhhbmRsZXJGYWxsYmFjayIsInBhcmFtcyIsImlkZW50aWZpZXIiLCJpZGVudFRvU3RyaW5nIiwidG9BcnJheSIsInNldEVzY0hhbmRsZXJGYWxsYmFjayIsInNldEV4ZWN1dGVIYW5kbGVyRmFsbGJhY2siLCJjb2RlIiwic2V0T3NjSGFuZGxlckZhbGxiYWNrIiwic2V0RGNzSGFuZGxlckZhbGxiYWNrIiwicGF5bG9hZCIsInNldFByaW50SGFuZGxlciIsInByaW50IiwiaW5zZXJ0Q2hhcnMiLCJpbnRlcm1lZGlhdGVzIiwic2Nyb2xsTGVmdCIsImN1cnNvclVwIiwic2Nyb2xsUmlnaHQiLCJjdXJzb3JEb3duIiwiY3Vyc29yRm9yd2FyZCIsImN1cnNvckJhY2t3YXJkIiwiY3Vyc29yTmV4dExpbmUiLCJjdXJzb3JQcmVjZWRpbmdMaW5lIiwiY3Vyc29yQ2hhckFic29sdXRlIiwiY3Vyc29yUG9zaXRpb24iLCJjdXJzb3JGb3J3YXJkVGFiIiwiZXJhc2VJbkRpc3BsYXkiLCJwcmVmaXgiLCJlcmFzZUluTGluZSIsImluc2VydExpbmVzIiwiZGVsZXRlTGluZXMiLCJkZWxldGVDaGFycyIsInNjcm9sbFVwIiwic2Nyb2xsRG93biIsImVyYXNlQ2hhcnMiLCJjdXJzb3JCYWNrd2FyZFRhYiIsImNoYXJQb3NBYnNvbHV0ZSIsImhQb3NpdGlvblJlbGF0aXZlIiwicmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyIiwic2VuZERldmljZUF0dHJpYnV0ZXNQcmltYXJ5Iiwic2VuZERldmljZUF0dHJpYnV0ZXNTZWNvbmRhcnkiLCJsaW5lUG9zQWJzb2x1dGUiLCJ2UG9zaXRpb25SZWxhdGl2ZSIsImhWUG9zaXRpb24iLCJ0YWJDbGVhciIsInNldE1vZGUiLCJzZXRNb2RlUHJpdmF0ZSIsInJlc2V0TW9kZSIsInJlc2V0TW9kZVByaXZhdGUiLCJjaGFyQXR0cmlidXRlcyIsImRldmljZVN0YXR1cyIsImRldmljZVN0YXR1c1ByaXZhdGUiLCJzb2Z0UmVzZXQiLCJzZXRDdXJzb3JTdHlsZSIsInNldFNjcm9sbFJlZ2lvbiIsInNhdmVDdXJzb3IiLCJ3aW5kb3dPcHRpb25zIiwicmVzdG9yZUN1cnNvciIsImluc2VydENvbHVtbnMiLCJkZWxldGVDb2x1bW5zIiwic2VsZWN0UHJvdGVjdGVkIiwicmVxdWVzdE1vZGUiLCJzZXRFeGVjdXRlSGFuZGxlciIsIkJFTCIsImJlbGwiLCJMRiIsImxpbmVGZWVkIiwiVlQiLCJGRiIsImNhcnJpYWdlUmV0dXJuIiwiQlMiLCJiYWNrc3BhY2UiLCJIVCIsInRhYiIsIlNPIiwic2hpZnRPdXQiLCJTSSIsInNoaWZ0SW4iLCJDMSIsIklORCIsIk5FTCIsIm5leHRMaW5lIiwiSFRTIiwidGFiU2V0IiwiT3NjSGFuZGxlciIsInNldFRpdGxlIiwic2V0SWNvbk5hbWUiLCJzZXRPclJlcG9ydEluZGV4ZWRDb2xvciIsInNldEh5cGVybGluayIsInNldE9yUmVwb3J0RmdDb2xvciIsInNldE9yUmVwb3J0QmdDb2xvciIsInNldE9yUmVwb3J0Q3Vyc29yQ29sb3IiLCJyZXN0b3JlSW5kZXhlZENvbG9yIiwicmVzdG9yZUZnQ29sb3IiLCJyZXN0b3JlQmdDb2xvciIsInJlc3RvcmVDdXJzb3JDb2xvciIsInJldmVyc2VJbmRleCIsImtleXBhZEFwcGxpY2F0aW9uTW9kZSIsImtleXBhZE51bWVyaWNNb2RlIiwiZnVsbFJlc2V0Iiwic2V0Z0xldmVsIiwic2VsZWN0RGVmYXVsdENoYXJzZXQiLCJmbGFnIiwiQ0hBUlNFVFMiLCJzZWxlY3RDaGFyc2V0Iiwic2NyZWVuQWxpZ25tZW50UGF0dGVybiIsInNldEVycm9ySGFuZGxlciIsIkRjc0hhbmRsZXIiLCJyZXF1ZXN0U3RhdHVzU3RyaW5nIiwiX3ByZXNlcnZlU3RhY2siLCJfbG9nU2xvd1Jlc29sdmluZ0FzeW5jIiwicCIsIlByb21pc2UiLCJyYWNlIiwicmVzIiwicmVqIiwiY2F0Y2giLCJlcnIiLCJfZ2V0Q3VycmVudExpbmtJZCIsIndhc1BhdXNlZCIsIkRFQlVHIiwicHJvdG90eXBlIiwic3BsaXQiLCJjbGVhclJhbmdlIiwibGVuIiwiZGVjb2RlIiwic3ViYXJyYXkiLCJ2aWV3cG9ydEVuZCIsInZpZXdwb3J0U3RhcnQiLCJjaFdpZHRoIiwiY2hhcnNldCIsIndyYXBhcm91bmRNb2RlIiwid3JhcGFyb3VuZCIsImluc2VydE1vZGUiLCJtb2RlcyIsImN1ckF0dHIiLCJidWZmZXJSb3ciLCJtYXJrRGlydHkiLCJzZXRDZWxsRnJvbUNvZGVwb2ludCIsInByZWNlZGluZ0pvaW5TdGF0ZSIsImNoIiwiY3VycmVudEluZm8iLCJjaGFyUHJvcGVydGllcyIsImV4dHJhY3RXaWR0aCIsInNob3VsZEpvaW4iLCJleHRyYWN0U2hvdWxkSm9pbiIsIm9sZFdpZHRoIiwic3RyaW5nRnJvbUNvZGVQb2ludCIsImFkZExpbmVUb0xpbmsiLCJvbGRSb3ciLCJvbGRDb2wiLCJfZXJhc2VBdHRyRGF0YSIsIkJ1ZmZlckxpbmUiLCJjb3B5Q2VsbHNGcm9tIiwiYWRkQ29kZXBvaW50VG9DZWxsIiwiZGVsdGEiLCJpbnNlcnRDZWxscyIsImdldE51bGxDZWxsIiwiTlVMTF9DRUxMX0NPREUiLCJOVUxMX0NFTExfV0lEVEgiLCJjb252ZXJ0RW9sIiwicmV2ZXJzZVdyYXBhcm91bmQiLCJfcmVzdHJpY3RDdXJzb3IiLCJvcmlnaW5hbFgiLCJuZXh0U3RvcCIsIm1heENvbCIsIl9zZXRDdXJzb3IiLCJfbW92ZUN1cnNvciIsImRpZmZUb1RvcCIsImRpZmZUb0JvdHRvbSIsInBhcmFtIiwidGFicyIsInByZXZTdG9wIiwiX2VyYXNlSW5CdWZmZXJMaW5lIiwiY2xlYXJXcmFwIiwicmVzcGVjdFByb3RlY3QiLCJyZXBsYWNlQ2VsbHMiLCJfcmVzZXRCdWZmZXJMaW5lIiwiY2xlYXJNYXJrZXJzIiwic2Nyb2xsQmFja1NpemUiLCJzY3JvbGxCb3R0b21Sb3dzT2Zmc2V0Iiwic2Nyb2xsQm90dG9tQWJzb2x1dGUiLCJkZWxldGVDZWxscyIsImpvaW5TdGF0ZSIsImlkYXRhIiwiaXRleHQiLCJjb2RlUG9pbnRBdCIsInRsZW5ndGgiLCJjb3B5V2l0aGluIiwiX2lzIiwidGVybSIsInRlcm1OYW1lIiwic2V0Z0NoYXJzZXQiLCJERUZBVUxUX0NIQVJTRVQiLCJhcHBsaWNhdGlvbktleXBhZCIsImFjdGl2ZUVuY29kaW5nIiwiYWN0aXZhdGVBbHRCdWZmZXIiLCJhY3RpdmF0ZU5vcm1hbEJ1ZmZlciIsImRtIiwibW91c2VQcm90b2NvbCIsIm1vdXNlRW5jb2RpbmciLCJjcyIsImIydiIsIm0iLCJfdXBkYXRlQXR0ckNvbG9yIiwibW9kZSIsImMxIiwiYzIiLCJjMyIsImZyb21Db2xvclJHQiIsIl9leHRyYWN0Q29sb3IiLCJhdHRyIiwiYWNjdSIsImNTcGFjZSIsImFkdmFuY2UiLCJoYXNTdWJQYXJhbXMiLCJzdWJwYXJhbXMiLCJnZXRTdWJQYXJhbXMiLCJ1bmRlcmxpbmVDb2xvciIsIl9wcm9jZXNzVW5kZXJsaW5lIiwidXBkYXRlRXh0ZW5kZWQiLCJfcHJvY2Vzc1NHUjAiLCJsIiwic2F2ZWRYIiwic2F2ZWRZIiwic2F2ZWRDdXJBdHRyRGF0YSIsInNhdmVkQ2hhcnNldCIsImlzQmxpbmtpbmciLCJib3R0b20iLCJzZWNvbmQiLCJfc2F2ZWRDaGFyc2V0Iiwic2xvdHMiLCJpZHgiLCJzcGVjIiwiZXhlYyIsImlzVmFsaWRDb2xvckluZGV4IiwiYXJncyIsIl9jcmVhdGVIeXBlcmxpbmsiLCJfZmluaXNoSHlwZXJsaW5rIiwicGFyc2VkUGFyYW1zIiwiaWRQYXJhbUluZGV4IiwiZmluZEluZGV4Iiwic3RhcnRzV2l0aCIsInJlZ2lzdGVyTGluayIsIl9zZXRPclJlcG9ydFNwZWNpYWxDb2xvciIsImNvbGxlY3RBbmRGbGFnIiwic2Nyb2xsUmVnaW9uSGVpZ2h0IiwibGV2ZWwiLCJ5T2Zmc2V0IiwibWFya0FsbERpcnR5IiwiZiIsImlzUHJvdGVjdGVkIiwiX2Rpc3Bvc2FibGVzIiwidW5yZWdpc3RlciIsIl92YWx1ZSIsImFycmF5IiwiX2RhdGEiLCJ0aGlyZCIsImZvdXJ0aCIsImlzTm9kZSIsInByb2Nlc3MiLCJ1c2VyQWdlbnQiLCJuYXZpZ2F0b3IiLCJwbGF0Zm9ybSIsImlzU2FmYXJpIiwibWFqb3JWZXJzaW9uIiwiaXNJcGFkIiwiaXNJcGhvbmUiLCJfZ2V0S2V5IiwiaW5zZXJ0IiwiX3NlYXJjaCIsImdldEtleUl0ZXJhdG9yIiwiZm9yRWFjaEJ5S2V5IiwidmFsdWVzIiwibWlkIiwibWlkS2V5IiwiVGFza1F1ZXVlIiwiX3Rhc2tzIiwiX2kiLCJlbnF1ZXVlIiwidGFzayIsIl9zdGFydCIsIl9pZGxlQ2FsbGJhY2siLCJfY2FuY2VsQ2FsbGJhY2siLCJfcmVxdWVzdENhbGxiYWNrIiwiX3Byb2Nlc3MiLCJkZWFkbGluZSIsInRhc2tEdXJhdGlvbiIsImxvbmdlc3RUYXNrIiwibGFzdERlYWRsaW5lUmVtYWluaW5nIiwidGltZVJlbWFpbmluZyIsImRlYWRsaW5lUmVtYWluaW5nIiwiUHJpb3JpdHlUYXNrUXVldWUiLCJfY3JlYXRlRGVhZGxpbmUiLCJkdXJhdGlvbiIsIklkbGVUYXNrUXVldWUiLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwiY2FuY2VsSWRsZUNhbGxiYWNrIiwiX3F1ZXVlIiwibGFzdENoYXIiLCJDSEFSX0RBVEFfQ09ERV9JTkRFWCIsIldISVRFU1BBQ0VfQ0VMTF9DT0RFIiwiRXh0ZW5kZWRBdHRycyIsIm5ld09iaiIsImlzQmxpbmsiLCJpc0ZnUkdCIiwiaXNCZ1JHQiIsImlzRmdQYWxldHRlIiwiaXNCZ1BhbGV0dGUiLCJpc0ZnRGVmYXVsdCIsImlzQmdEZWZhdWx0IiwiaXNBdHRyaWJ1dGVEZWZhdWx0IiwiaXNFbXB0eSIsImdldFVuZGVybGluZUNvbG9yTW9kZSIsImlzVW5kZXJsaW5lQ29sb3JQYWxldHRlIiwiZ2V0VW5kZXJsaW5lU3R5bGUiLCJnZXRVbmRlcmxpbmVWYXJpYW50T2Zmc2V0IiwidW5kZXJsaW5lVmFyaWFudE9mZnNldCIsIl91cmxJZCIsIl9leHQiLCJNQVhfQlVGRkVSX1NJWkUiLCJfaGFzU2Nyb2xsYmFjayIsIl9udWxsQ2VsbCIsImZyb21DaGFyRGF0YSIsIk5VTExfQ0VMTF9DSEFSIiwiX3doaXRlc3BhY2VDZWxsIiwiV0hJVEVTUEFDRV9DRUxMX1dJRFRIIiwiX2lzQ2xlYXJpbmciLCJfbWVtb3J5Q2xlYW51cFF1ZXVlIiwiX21lbW9yeUNsZWFudXBQb3NpdGlvbiIsIl9jb2xzIiwiX3Jvd3MiLCJfZ2V0Q29ycmVjdEJ1ZmZlckxlbmd0aCIsInNldHVwVGFiU3RvcHMiLCJnZXRXaGl0ZXNwYWNlQ2VsbCIsInJlbGF0aXZlWSIsImNvcnJlY3RCdWZmZXJMZW5ndGgiLCJzY3JvbGxiYWNrIiwiZmlsbFZpZXdwb3J0Um93cyIsImZpbGxBdHRyIiwibmV3Q29scyIsIm5ld1Jvd3MiLCJudWxsQ2VsbCIsImRpcnR5TWVtb3J5TGluZXMiLCJhZGRUb1kiLCJhbW91bnRUb1RyaW0iLCJfaXNSZWZsb3dFbmFibGVkIiwiX3JlZmxvdyIsIl9iYXRjaGVkTWVtb3J5Q2xlYW51cCIsIm5vcm1hbFJ1biIsImNvdW50ZWQiLCJjbGVhbnVwTWVtb3J5IiwiX3JlZmxvd0xhcmdlciIsIl9yZWZsb3dTbWFsbGVyIiwidG9SZW1vdmUiLCJyZWZsb3dMYXJnZXJHZXRMaW5lc1RvUmVtb3ZlIiwibmV3TGF5b3V0UmVzdWx0IiwicmVmbG93TGFyZ2VyQ3JlYXRlTmV3TGF5b3V0IiwicmVmbG93TGFyZ2VyQXBwbHlOZXdMYXlvdXQiLCJsYXlvdXQiLCJfcmVmbG93TGFyZ2VyQWRqdXN0Vmlld3BvcnQiLCJjb3VudFJlbW92ZWQiLCJ2aWV3cG9ydEFkanVzdG1lbnRzIiwidG9JbnNlcnQiLCJjb3VudFRvSW5zZXJ0Iiwid3JhcHBlZExpbmVzIiwiYWJzb2x1dGVZIiwibGFzdExpbmVMZW5ndGgiLCJkZXN0TGluZUxlbmd0aHMiLCJyZWZsb3dTbWFsbGVyR2V0TmV3TGluZUxlbmd0aHMiLCJsaW5lc1RvQWRkIiwidHJpbW1lZExpbmVzIiwibmV3TGluZXMiLCJuZXdMaW5lIiwiZGVzdExpbmVJbmRleCIsImRlc3RDb2wiLCJzcmNMaW5lSW5kZXgiLCJzcmNDb2wiLCJjZWxsc1RvQ29weSIsIndyYXBwZWRMaW5lc0luZGV4IiwiZ2V0V3JhcHBlZExpbmVUcmltbWVkTGVuZ3RoIiwic2V0Q2VsbCIsImluc2VydEV2ZW50cyIsIm9yaWdpbmFsTGluZXMiLCJvcmlnaW5hbExpbmVzTGVuZ3RoIiwib3JpZ2luYWxMaW5lSW5kZXgiLCJuZXh0VG9JbnNlcnRJbmRleCIsIm5leHRUb0luc2VydCIsImNvdW50SW5zZXJ0ZWRTb0ZhciIsIm5leHRJIiwiaW5zZXJ0Q291bnRFbWl0dGVkIiwibGluZUluZGV4IiwidHJpbVJpZ2h0IiwidGFiU3RvcFdpZHRoIiwiTWFya2VyIiwiX3JlbW92ZU1hcmtlciIsIiRzdGFydEluZGV4IiwiZmlsbENlbGxEYXRhIiwiX2NvbWJpbmVkIiwiX2V4dGVuZGVkQXR0cnMiLCJDSEFSX0RBVEFfQVRUUl9JTkRFWCIsIkNIQVJfREFUQV9DSEFSX0lOREVYIiwiQ0hBUl9EQVRBX1dJRFRIX0lOREVYIiwiY29kZVBvaW50IiwiYXR0cnMiLCJieXRlTGVuZ3RoIiwidWludDMyQ2VsbHMiLCJrZXlzIiwiZXh0S2V5cyIsImNvcHlGcm9tIiwic3JjIiwiYXBwbHlJblJldmVyc2UiLCJzcmNEYXRhIiwic3JjQ29tYmluZWRLZXlzIiwib3V0Q29sdW1ucyIsImJ1ZmZlckNvbHMiLCJlbmRzSW5OdWxsIiwiZm9sbG93aW5nTGluZVN0YXJ0c1dpdGhXaWRlIiwib2xkQ29scyIsImJ1ZmZlckFic29sdXRlWSIsInNyY1RyaW1tZWRUaW5lTGVuZ3RoIiwic3JjUmVtYWluaW5nQ2VsbHMiLCJkZXN0UmVtYWluaW5nQ2VsbHMiLCJjb3VudFRvUmVtb3ZlIiwibmV4dFRvUmVtb3ZlSW5kZXgiLCJuZXh0VG9SZW1vdmVTdGFydCIsImNvdW50UmVtb3ZlZFNvRmFyIiwibmV3TGF5b3V0IiwibmV3TGF5b3V0TGluZXMiLCJuZXdMaW5lTGVuZ3RocyIsImNlbGxzTmVlZGVkIiwicmVkdWNlIiwic3JjTGluZSIsImNlbGxzQXZhaWxhYmxlIiwib2xkVHJpbW1lZExlbmd0aCIsImVuZHNXaXRoV2lkZSIsIkJ1ZmZlclNldCIsIl9vbkJ1ZmZlckFjdGl2YXRlIiwiX25vcm1hbCIsIkJ1ZmZlciIsIl9hbHQiLCJpbmFjdGl2ZUJ1ZmZlciIsIm9iaiIsImNvbWJpbmVkIiwiREVGQVVMVF9DT0xPUiIsIkRFRkFVTFRfQVRUUiIsIkRFRkFVTFRfRVhUIiwiX2lkIiwiaXNEaXNwb3NlZCIsIl9uZXh0SWQiLCJfb25EaXNwb3NlIiwiZGlzcG9zYWJsZSIsIkMiLCJOVUwiLCJTT0giLCJTVFgiLCJFT1QiLCJFTlEiLCJBQ0siLCJETEUiLCJEQzEiLCJEQzIiLCJEQzMiLCJEQzQiLCJOQUsiLCJTWU4iLCJFVEIiLCJDQU4iLCJFTSIsIlNVQiIsIkZTIiwiR1MiLCJSUyIsIlVTIiwiU1AiLCJQQUQiLCJIT1AiLCJCUEgiLCJOQkgiLCJTU0EiLCJFU0EiLCJIVEoiLCJWVFMiLCJQTEQiLCJQTFUiLCJSSSIsIlNTMiIsIlNTMyIsIkRDUyIsIlBVMSIsIlBVMiIsIlNUUyIsIkNDSCIsIk1XIiwiU1BBIiwiRVBBIiwiU09TIiwiU0dDSSIsIlNDSSIsIkNTSSIsIk9TQyIsIlBNIiwiQVBDIiwiS0VZQ09ERV9LRVlfTUFQUElOR1MiLCJhcHBsaWNhdGlvbkN1cnNvck1vZGUiLCJtb2RpZmllcnMiLCJrZXlNYXBwaW5nIiwia2V5U3RyaW5nIiwidG9VcHBlckNhc2UiLCJ0b0xvd2VyQ2FzZSIsIl9pbnRlcmltIiwic3RhcnRQb3MiLCJpbnRlcmltIiwiVWludDhBcnJheSIsImJ5dGUxIiwiYnl0ZTIiLCJieXRlMyIsImJ5dGU0IiwiZGlzY2FyZEludGVyaW0iLCJ0bXAiLCJtaXNzaW5nIiwiZm91clN0b3AiLCJCTVBfQ09NQklOSU5HIiwiSElHSF9DT01CSU5JTkciLCJ0YWJsZSIsInZlcnNpb24iLCJ3Y3dpZHRoIiwibnVtIiwidWNzIiwiYmlzZWFyY2giLCJwcmVjZWRpbmciLCJjcmVhdGVQcm9wZXJ0eVZhbHVlIiwiX2FjdGlvbiIsIl9jYWxsYmFja3MiLCJfcGVuZGluZ0RhdGEiLCJfYnVmZmVyT2Zmc2V0IiwiX2lzU3luY1dyaXRpbmciLCJfc3luY0NhbGxzIiwiX2RpZFVzZXJJbnB1dCIsImNodW5rIiwiY2IiLCJfaW5uZXJXcml0ZSIsImxhc3RUaW1lIiwiY29udGludWF0aW9uIiwicmVzb2x2ZSIsInRoZW4iLCJSR0JfUkVYIiwiSEFTSF9SRVgiLCJwYWQiLCJiaXRzIiwiczIiLCJsb3ciLCJiYXNlIiwiYWR2IiwiUEFZTE9BRF9MSU1JVCIsIkVNUFRZX0hBTkRMRVJTIiwiX2hhbmRsZXJzIiwiY3JlYXRlIiwiX2FjdGl2ZSIsIl9pZGVudCIsIl9oYW5kbGVyRmIiLCJfc3RhY2siLCJsb29wUG9zaXRpb24iLCJmYWxsVGhyb3VnaCIsInJlZ2lzdGVySGFuZGxlciIsImhhbmRsZXJMaXN0IiwiaGFuZGxlckluZGV4IiwiY2xlYXJIYW5kbGVyIiwic2V0SGFuZGxlckZhbGxiYWNrIiwidW5ob29rIiwiaG9vayIsInB1dCIsInV0ZjMyVG9TdHJpbmciLCJzdWNjZXNzIiwiaGFuZGxlclJlc3VsdCIsIkVNUFRZX1BBUkFNUyIsIlBhcmFtcyIsImFkZFBhcmFtIiwiX2hhbmRsZXIiLCJfcGFyYW1zIiwiX2hpdExpbWl0IiwicmV0IiwiVHJhbnNpdGlvblRhYmxlIiwic2V0RGVmYXVsdCIsIm5leHQiLCJhZGRNYW55IiwiY29kZXMiLCJOT05fQVNDSUlfUFJJTlRBQkxFIiwiVlQ1MDBfVFJBTlNJVElPTl9UQUJMRSIsImJsdWVwcmludCIsImFwcGx5IiwidW51c2VkIiwiUFJJTlRBQkxFUyIsIkVYRUNVVEFCTEVTIiwic3RhdGVzIiwiX3RyYW5zaXRpb25zIiwiaGFuZGxlcnMiLCJoYW5kbGVyUG9zIiwidHJhbnNpdGlvbiIsImNodW5rUG9zIiwiaW5pdGlhbFN0YXRlIiwiY3VycmVudFN0YXRlIiwiX2NvbGxlY3QiLCJfcHJpbnRIYW5kbGVyRmIiLCJfZXhlY3V0ZUhhbmRsZXJGYiIsIl9jc2lIYW5kbGVyRmIiLCJfZXNjSGFuZGxlckZiIiwiX2Vycm9ySGFuZGxlckZiIiwiX3ByaW50SGFuZGxlciIsIl9leGVjdXRlSGFuZGxlcnMiLCJfY3NpSGFuZGxlcnMiLCJfZXNjSGFuZGxlcnMiLCJfb3NjUGFyc2VyIiwiT3NjUGFyc2VyIiwiX2Rjc1BhcnNlciIsIkRjc1BhcnNlciIsIl9lcnJvckhhbmRsZXIiLCJfaWRlbnRpZmllciIsImZpbmFsUmFuZ2UiLCJpbnRlcm1lZGlhdGUiLCJmaW5hbENvZGUiLCJyZXZlcnNlIiwiY2xlYXJQcmludEhhbmRsZXIiLCJjbGVhckVzY0hhbmRsZXIiLCJjbGVhckV4ZWN1dGVIYW5kbGVyIiwiY2xlYXJDc2lIYW5kbGVyIiwiY2xlYXJEY3NIYW5kbGVyIiwiY2xlYXJPc2NIYW5kbGVyIiwiY2xlYXJFcnJvckhhbmRsZXIiLCJjb2xsZWN0IiwiYWJvcnQiLCJhZGRTdWJQYXJhbSIsImFkZERpZ2l0IiwiaGFuZGxlcnNFc2MiLCJqaiIsIl9zdGF0ZSIsIl9wdXQiLCJNQVhfVkFMVUUiLCJmcm9tQXJyYXkiLCJrIiwibWF4U3ViUGFyYW1zTGVuZ3RoIiwiSW50MzJBcnJheSIsIl9zdWJQYXJhbXMiLCJfc3ViUGFyYW1zTGVuZ3RoIiwiX3N1YlBhcmFtc0lkeCIsIlVpbnQxNkFycmF5IiwiX3JlamVjdERpZ2l0cyIsIl9yZWplY3RTdWJEaWdpdHMiLCJfZGlnaXRJc1N1YiIsIm5ld1BhcmFtcyIsImdldFN1YlBhcmFtc0FsbCIsInN0b3JlIiwiY3VyIiwiX2FkZG9ucyIsImluc3RhbmNlIiwibG9hZEFkZG9uIiwibG9hZGVkQWRkb24iLCJfd3JhcHBlZEFkZG9uRGlzcG9zZSIsIl9idWZmZXIiLCJpbml0IiwiYmFzZVkiLCJnZXRMaW5lIiwiQnVmZmVyTGluZUFwaVZpZXciLCJfbGluZSIsImdldENlbGwiLCJzdGFydENvbHVtbiIsImVuZENvbHVtbiIsIkJ1ZmZlck5hbWVzcGFjZUFwaSIsIl9jb3JlIiwiX29uQnVmZmVyQ2hhbmdlIiwib25CdWZmZXJDaGFuZ2UiLCJCdWZmZXJBcGlWaWV3IiwiX2FsdGVybmF0ZSIsImFsdGVybmF0ZSIsImFkZENzaUhhbmRsZXIiLCJhZGREY3NIYW5kbGVyIiwiYWRkRXNjSGFuZGxlciIsImFkZE9zY0hhbmRsZXIiLCJwcm92aWRlciIsInZlcnNpb25zIiwiYWN0aXZlVmVyc2lvbiIsImlzVXNlclNjcm9sbGluZyIsIl9jYWNoZWRCbGFua0xpbmUiLCJ0b3BSb3ciLCJib3R0b21Sb3ciLCJ3aWxsQnVmZmVyQmVUcmltbWVkIiwib2xkWWRpc3AiLCJnbGV2ZWwiLCJfY2hhcnNldHMiLCJERUZBVUxUX1BST1RPQ09MUyIsIk5PTkUiLCJyZXN0cmljdCIsIlgxMCIsIlZUMjAwIiwiRFJBRyIsIkFOWSIsImV2ZW50Q29kZSIsImlzU0dSIiwiUyIsIkRFRkFVTFRfRU5DT0RJTkdTIiwiREVGQVVMVCIsIlNHUiIsIlNHUl9QSVhFTFMiLCJfcHJvdG9jb2xzIiwiX2VuY29kaW5ncyIsIl9hY3RpdmVQcm90b2NvbCIsIl9hY3RpdmVFbmNvZGluZyIsIl9sYXN0RXZlbnQiLCJfb25Qcm90b2NvbENoYW5nZSIsIm5hbWUiLCJhZGRQcm90b2NvbCIsImFkZEVuY29kaW5nIiwiZW5jb2RpbmciLCJfZXF1YWxFdmVudHMiLCJyZXBvcnQiLCJ0cmlnZ2VyQmluYXJ5RXZlbnQiLCJkb3duIiwidXAiLCJkcmFnIiwibW92ZSIsImUxIiwiZTIiLCJwaXhlbHMiLCJERUZBVUxUX01PREVTIiwiREVGQVVMVF9ERUNfUFJJVkFURV9NT0RFUyIsIl9vblVzZXJJbnB1dCIsIl9vblJlcXVlc3RTY3JvbGxUb0JvdHRvbSIsImRpc2FibGVTdGRpbiIsIiR4bWluIiwiJHhtYXgiLCJfZGVjb3JhdGlvbnMiLCJTb3J0ZWRMaXN0IiwiX29uRGVjb3JhdGlvblJlZ2lzdGVyZWQiLCJfb25EZWNvcmF0aW9uUmVtb3ZlZCIsIkRlY29yYXRpb24iLCJtYXJrZXJEaXNwb3NlIiwiZ2V0RGVjb3JhdGlvbnNBdENlbGwiLCJ4bWluIiwieG1heCIsIl9jYWNoZWRCZyIsIl9jYWNoZWRGZyIsImZvcmVncm91bmRDb2xvciIsIlNlcnZpY2VDb2xsZWN0aW9uIiwiX2VudHJpZXMiLCJzZXJ2aWNlIiwiX3NlcnZpY2VzIiwiZ2V0U2VydmljZSIsImN0b3IiLCJzZXJ2aWNlRGVwZW5kZW5jaWVzIiwiZ2V0U2VydmljZURlcGVuZGVuY2llcyIsInNvcnQiLCJzZXJ2aWNlQXJncyIsImRlcGVuZGVuY3kiLCJmaXJzdFNlcnZpY2VBcmdQb3MiLCJvcHRpb25zS2V5VG9Mb2dMZXZlbCIsInRyYWNlIiwiVFJBQ0UiLCJpbmZvIiwiSU5GTyIsIkVSUk9SIiwib2ZmIiwiT0ZGIiwidHJhY2VMb2dnZXIiLCJfbG9nTGV2ZWwiLCJfdXBkYXRlTG9nTGV2ZWwiLCJfZXZhbExhenlPcHRpb25hbFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwiX2xvZyIsIm1lc3NhZ2UiLCJsb2dnZXIiLCJsb2ciLCJfdGFyZ2V0IiwiZGVzY3JpcHRvciIsImZuIiwiSlNPTiIsInN0cmluZ2lmeSIsIkRFRkFVTFRfT1BUSU9OUyIsImN1c3RvbUdseXBocyIsImFsbG93UHJvcG9zZWRBcGkiLCJhbGxvd1RyYW5zcGFyZW5jeSIsInJlc2NhbGVPdmVybGFwcGluZ0dseXBocyIsIkZPTlRfV0VJR0hUX09QVElPTlMiLCJfb25PcHRpb25DaGFuZ2UiLCJkZWZhdWx0T3B0aW9ucyIsIl9zYW5pdGl6ZUFuZFZhbGlkYXRlT3B0aW9uIiwiX3NldHVwT3B0aW9ucyIsImV2ZW50S2V5IiwiZ2V0dGVyIiwicHJvcE5hbWUiLCJzZXR0ZXIiLCJkZXNjIiwiZGVmaW5lUHJvcGVydHkiLCJpc0N1cnNvclN0eWxlIiwiX2VudHJpZXNXaXRoSWQiLCJfZGF0YUJ5TGlua0lkIiwiX3JlbW92ZU1hcmtlckZyb21MaW5rIiwiY2FzdERhdGEiLCJfZ2V0RW50cnlJZEtleSIsImxpbmtJZCIsImV2ZXJ5IiwibGlua0RhdGEiLCJESV9UQVJHRVQiLCJESV9ERVBFTkRFTkNJRVMiLCJzZXJ2aWNlUmVnaXN0cnkiLCJkZWNvcmF0b3IiLCJhcmd1bWVudHMiLCJzdG9yZVNlcnZpY2VEZXBlbmRlbmN5IiwiZXh0cmFjdENoYXJLaW5kIiwiX3Byb3ZpZGVycyIsIl9vbkNoYW5nZSIsIm9uQ2hhbmdlIiwiZGVmYXVsdFByb3ZpZGVyIiwiVW5pY29kZVY2IiwiX2FjdGl2ZVByb3ZpZGVyIiwiZ2V0U3RyaW5nQ2VsbFdpZHRoIiwicHJlY2VkaW5nSW5mbyIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJDT05TVFJVQ1RPUl9PTkxZX09QVElPTlMiLCJfYWRkb25NYW5hZ2VyIiwiQWRkb25NYW5hZ2VyIiwiX3B1YmxpY09wdGlvbnMiLCJfY2hlY2tSZWFkb25seU9wdGlvbnMiLCJfY2hlY2tQcm9wb3NlZEFwaSIsInBhcnNlciIsIlBhcnNlckFwaSIsInVuaWNvZGUiLCJVbmljb2RlQXBpIiwibW91c2VUcmFja2luZ01vZGUiLCJhcHBsaWNhdGlvbkN1cnNvcktleXNNb2RlIiwiYXBwbGljYXRpb25LZXlwYWRNb2RlIiwib3JpZ2luTW9kZSIsInJldmVyc2VXcmFwYXJvdW5kTW9kZSIsInNlbmRGb2N1c01vZGUiLCJfdmVyaWZ5SW50ZWdlcnMiLCJfdmVyaWZ5UG9zaXRpdmVJbnRlZ2VycyIsIndyaXRlbG4iLCJhZGRvbiIsInN0cmluZ3MiLCJJbmZpbml0eSJdLCJzb3VyY2VSb290IjoiIn0=
|